2017-10-25 1 views
2

ifelse 기능이 데이터 프레임에서 제대로 작동하지 않는 문제가 발생했습니다. 그룹화 된 데이터에 조건부를 기반으로 새 열을 추가하려고하지만 첫 번째 요소 만 새 열로 전달되는 것으로 보입니다. 그룹화 된 데이터에서 이상한 동작이 발생하는 경우

df <- data.frame(ID = c(1, 1, 1 ,2, 2, 5), A = c("foo", "bar", "bar", "foo", "foo", "bar"), B = c(seq(1:6))) 

ID A B 
1 1 foo 1 
2 1 bar 2 
3 1 bar 3 
4 2 foo 4 
5 2 foo 5 
6 5 bar 6 



df%>% 
    group_by(ID) %>% 
    mutate(C = ifelse(length(which(A == 'bar')) >= 2, B, NA)) 


# A tibble: 6 x 4 
# Groups: ID [3] 
    ID  A  B  C 
    <dbl> <fctr> <int> <int> 
1  1 foo  1  1 
2  1 bar  2  1 
3  1 bar  3  1 
4  2 foo  4 NA 
5  2 foo  5 NA 
6  5 bar  6 NA 

는 또한 tidyverse/dplyr/issues/489

처럼 do을 시도했지만 같은 결과를 생성합니다. 매트릭스는 무엇

)

예상 출력 여기서

# A tibble: 6 x 4 
# Groups: ID [3] 
    ID  A  B  C 
    <dbl> <fctr> <int> <int> 
1  1 foo  1  1 
2  1 bar  2  2 
3  1 bar  3  3 
4  2 foo  4 NA 
5  2 foo  5 NA 
6  5 bar  6 NA 

답변

4

질병은

df %>% 
    group_by(ID) %>% 
    summarise(ind = length(which(A=='bar'))>=2) 
# A tibble: 3 x 2 
#  ID ind 
# <dbl> <lgl> 
#1  1 TRUE 
#2  2 FALSE 
#3  5 FALSE 

그래서 그것이 더 각 'ID'의 length 1 논리 vector 반환 if/else을 사용하십시오. ifelse을 사용하는 경우 test, yesno은 모두 length이어야합니다. test가 하나의 요소를 반환으로 우리는 여전히해야 할 경우, 'B', 즉의 첫 번째 요소는 우리가

df %>% 
    group_by(ID) %>% 
    mutate(C = if(length(which(A=='bar'))>=2) B else NA) 
# A tibble: 6 x 4 
# Groups: ID [3] 
#  ID  A  B C 
# <dbl> <fctr> <int> <int> 
#1  1 foo  1  1 
#2  1 bar  2  2 
#3  1 bar  3  3 
#4  2 foo  4 NA 
#5  2 foo  5 NA 
#6  5 bar  6 NA 

그러나 전체 'ID'에 대한 채우기 'B'의 첫 번째 요소를 얻을 수 ifelse을 사용하고 rep

df %>% 
    group_by(ID) %>% 
    mutate(C=ifelse(rep(length(which(A=='bar'))>=2, n()),B,NA)) 
# A tibble: 6 x 4 
# Groups: ID [3] 
#  ID  A  B  C 
# <dbl> <fctr> <int> <int> 
#1  1 foo  1  1 
#2  1 bar  2  2 
#3  1 bar  3  3 
#4  2 foo  4 NA 
#5  2 foo  5 NA 
#6  5 bar  6 NA 
관련 문제