2016-11-20 9 views
0

전체 데이터 프레임에서 논리 연산자를 사용하여 데이터 프레임을 필터링하려고하는데 NA 행이 서브셋 된 데이터 프레임에 들어온 것입니다. Subsetting R data frame results in mysterious NA rowsSubsetting R data frame results in mysterious NA rows을 통해 알게되었지만 해결책을 찾지 못했습니다.NA 행이 오감으로 인해 데이터 프레임 필터링 문제가 발생했습니다.

df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82)) 
df 
df[df>=0 & !is.na(df$number2),] 

원본 데이터 프레임의 모든 행에 음수 값이 없도록 필터링하려고합니다. 나는 여러 개의 NA 행을 가진 18 행 df를 얻는다.

내 df에서 논리 연산이 제대로 작동하는지 확인하기 위해 sapply를 사용 해봤습니다. 그러나 만약 내가 "어느 쪽"으로 감싸면 나는 18 개의 줄을 모두 얻는다.

sapply(names(df), function(x) df[x]>=0) 

내 목표는 임의의 열에 음수 값이없는 df를 얻는 것입니다.

편집 : 제 경우에는 필터를 걸기 전에 결과 df가 얼마나 많은 열을 가지는지 알지 못합니다. 따라서 열을 개별적으로 필터하면 & 연산자가 문제가되지 않습니다. 이것이 논리적 연산자 또는 전체 df를 적용하려고 한 이유입니다.

답변

1

먼저 당신이 하나의 벡터에 매트릭스를 줄이는 것입니다 필요가 있다고 생각합니다. 당신이 컬럼의 수에이 일반화하려는 경우, 당신도

df[Reduce(`&`, lapply(df, `>=`, 0)), ] 
# number1 number2 
# 1  1  10 
# 2  2  9 
# 3  3  8 
# 4  4  7 
# 5  5  6 

또는

df[rowSums(df >= 0) == ncol(df), ] 
# number1 number2 
# 1  1  10 
# 2  2  9 
# 3  3  8 
# 4  4  7 
# 5  5  6 
0

문제는 행을 필터링하려고하는 것이므로 선택기에 1 차원 논리 벡터를 전달해야한다는 것입니다. 2 차원 논리적 행렬을 전달합니다. 이 행렬을 셀렉터로 사용한다는 것은 반드시 행이 필터링되지 않는다는 것을 의미합니다. 값은 제거됩니다. 다음 작업을 수행 할 경우

, 그것은 어떤 결과의 NA

df[,1]>=0 & df[,2]>=0 모두 열 긍정적 인 행의 1D 논리적 인 벡터를 반환
df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82)) 
df 
df[df[,1]>=0 & df[,2]>=0,] 

없이 음의 값을 가진 모든 행을 제거합니다.

+0

감사를 할 수 있습니다. 그러나 이것은 단지 작동합니다. 얼마나 많은 열이 내 df에서 가질 것인지를 안다면. 필자의 경우, 필터를 적용하기 전에 생성 된 df가 얼마나 많은 컬럼을 가지는지 알지 못한다. 이것이 바로 논리 연산자 또는 전체 df를 적용하려는 이유입니다. – SuperSatya

0

다음을 시도해보십시오. 당신이 원하는 조건 사이에 을 사용

> df[df$number1>0 & df$number2>0,] 
    number1 number2 
1  1  10 
2  2  9 
3  3  8 
4  4  7 
5  5  6