我遇到了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
中尝试了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
答案 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
时,test
,yes
和no
应该是相同的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