2017-11-25 3 views
2

다소 시끄러운 데이터 세트로 작업 중이며 그룹 내에서 두 행의 데이터를 선택적으로 선택하거나 혼자있게 두는 것이 좋은지 궁금합니다. 논리별로 그룹별로 필터링하고 두 번째 열의 값에 따라 행을 비교하는 if-else 유형 제어 구조를 작성하려고합니다.데이터 프레임의 행 사이 선택

예 :

I는 ID로 그룹화 할
Row ID V1 V2 
1 1 blah 1.2 
2 1 blah NA 
3 2 foo 2.3 
4 3 bar NA 
5 3 bar NA 

(1, 2, 3)을 열 V2로 이동 행 2 NA를 갖기 때문에 2 행에 걸쳐, 예를 들면 1 행을 선택한다. 그러나 4 번과 5 번 행의 경우 둘 다 'NA'인 경우에만 혼자두고 싶습니다.

감사합니다, 당신은 수도가 정말 당신이 정확히 무슨에 따라 필요가있는 무엇

답변

1

. 의 NA의 경우,이 도움이 될 수 있습니다 : 해결책은 purrr를 사용

df <- data.frame(
    Row = c(1, 2, 3, 4, 5), 
    ID = c(1, 1, 2, 3, 3), 
    V1 = c("bla", "bla", "foo", "bla", "bla"), 
    V2 = c(1.2, NA, 2.3, NA, NA), 
    stringsAsFactors = FALSE) 
df <- df[complete.cases(df), ] 
+0

나는 그것이 단지 그들을 어떤의 NA가있는 모든 행을 삭제하기 때문에이 작품 생각하지 않습니다. 나는 그것을하고 싶지 않다. 나는 V2에서 non-NA 결과를 가진 행을 선택하거나, V2가 해당 ID 그룹에 대해 NA 결과 만 가지고 있다면 모두 유지하려고한다. – MMYang

+0

'is.na'를보세요. 추가 도움이 필요하면 예상 결과와 함께 예제를 제공하십시오. – Christoph

0

. 아이디어는 split에 데이터 프레임 ID에 의하여이다. 그런 다음 V2의 모든 요소가 NA인지 평가하는 사용자 정의 함수를 적용하십시오. TRUE 인 경우 원래 데이터 프레임을 반환하고 그렇지 않으면 인 행을 필터링하여 na.omit을 사용하여 데이터 프레임의 하위 집합을 반환합니다. map_dfrlapply과 유사하지만 목록의 모든 데이터 프레임을 자동으로 결합 할 수 있습니다. dt2이 최종 출력입니다.

library(purrr) 

dt2 <- dt %>% 
    split(.$ID) %>% 
    map_dfr(function(x){ 
    if(all(is.na(x$V2))){ 
     return(x) 
    } else { 
     return(na.omit(x)) 
    } 
    }) 
dt2 
# Row ID V1 V2 
# 1 1 1 blah 1.2 
# 2 3 2 foo 2.3 
# 3 4 3 bar NA 
# 4 5 3 bar NA 

데이터

dt <- read.table(text = "Row ID V1 V2 
1 1 blah 1.2 
2 1 blah NA 
3 2 foo 2.3 
4 3 bar NA 
5 3 bar NA", 
       header = TRUE, stringsAsFactors = FALSE) 
관련 문제