2017-10-25 13 views
2

私はifelse機能が正しく私のデータフレームに働いていないとの問題時に来ています。グループ化されたデータに条件に基づいて新しい列を追加したいが、最初の要素だけが新しい列に渡されているようだ。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を試してみましたが、それは同じ結果を生成します。

MATRIX何である)

期待出力

# 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

ここで条件は、それぞれ 'ID' のlength 1の論理vectorを返し

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 

は、それが優れていますif/elseを使用してください。我々はifelseを使用する場合は、testyesnoは同じlengthである必要があります。 testは、単一の要素を返していると、「B」、すなわちの最初の要素は、我々はまだする必要がある場合は、しかし、全体の「ID」

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 

のために投入する「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