ifelse分组数据中的奇怪行为

时间:2017-10-25 18:50:45

标签: r if-statement dplyr

我遇到了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

1 个答案:

答案 0 :(得分:4)

此处条件为每个&#39; ID&#39;返回vector 1的逻辑length

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返回单个元素时,&#39; B&#39;的第一个元素即我们得到了&#39; B&#39;填充整个&#39; ID&#39;

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

但是,如果我们仍然需要使用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