문제
R을 사용하여로드 할 수있는 데이터 파일의 CSV가 있습니다. read.csv()
일부 데이터가 누락되었으므로 데이터 프레임을 전적으로 비 이동 데이터로 구성된 데이터 프레임을 낮추고 싶습니다. NULL
어디서나 나타나면 필터링 된 데이터 세트에서 해당 열과 행을 제외하고 싶습니다.
나는 내장 된 R 벡터 작업으로 간단하게 이것을 할 수 있다는 것을 알고 있지만, 정확히 어떻게 해야할지 잘 모르겠습니다.
내 질문을 좀 더 구체적으로 만들려면 여기에 데이터의 빠른 샘플이있어 내가하고 싶은 일을 볼 수 있습니다.
DocID Anno1 Anno7 Anno8
1 7 NULL 8
2 8 NULL 3
44 10 2 3
45 6 6 6
46 1 3 4
49 3 8 5
62 4 NULL 9
63 2 NULL 4
67 11 NULL 3
91 NULL 9 7
92 NULL 7 5
93 NULL 8 8
따라서이 입력이 주어지면 이에 대한 출력을 줄이는 코드가 필요합니다.
DocID Anno8
44 3
45 6
46 4
49 5
처럼 Anno8
Null이 아닌 데이터가있는 유일한 열이며 Null 데이터가없는 4 개의 행만 있습니다.
해결책
만약에 x
너의 data.frame
(또는 matrix
) 그 다음에
x[ ,apply(x, 2, function(z) !any(is.na(z)))]
예제가 사용되므로 NULL
, is.na(·)
대체됩니다 is.null(·)
또는 당신은 볼 수 있습니다 subset(·)
.
다른 팁
na.omit ()를 사용하여 누락 된 행을 삭제할 수는 있지만 원하는 것은 아닙니다. 또한 현재 인정 된 답변은 잘못되었습니다. 완전한 열을 제공하지만 하나 이상의 결 측값이있는 행을 삭제하지는 않습니다. 정답은 다음과 같이 얻을 수 있습니다.
> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
> a
a b c
1 1 NA 3
2 2 1 4
> na.omit(a)[,colSums(is.na(a))==0]
a c
2 2 4
위의 대답이 잘못되었는지 확인하기 위해 :
> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
a c
1 1 3
2 2 4
열 2의 NA로 인해 1 행 1을 떨어 뜨려야합니다.
a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))
na.omit(a)
a b c
2 2 1 4
4 1 1 1
a[rowSums(is.na(a))==0,]
a b c
2 2 1 4
4 1 1 1
a[complete.cases(a),]
a b c
2 2 1 4
4 1 1 1
또한, 당신은 그것을 사용할 수 있습니다 sqldf
도서관, if x
데이터 프레임입니다 :
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")