r-按组在上一列的基础上创建新列;如果缺失,请使用NA



我正在尝试从一列中按组选择一个值,并将其作为值传递到另一列,扩展到整个组。这和这里提出的问题类似。BUt,有些组没有这个数字:在这种情况下,我需要用NA填充列。如何做到这一点?

伪示例:

dd1 <- data.frame(type = c(1,1,1),
grp = c('a', 'b', 'd'),
val = c(1,2,3))
dd2 <- data.frame(type = c(2,2),
grp = c('a', 'b'),
val = c(8,2))
dd3 <- data.frame(type = c(3,3),
grp = c('b', 'd'),
val = c(7,4))
dd <- rbind(dd1, dd2, dd3)

创建新列:

dd %>% 
group_by(type) %>% 
mutate(#val_a = ifelse(grp == 'a', val , NA),
val_a2 = val[grp == 'a'])

预期结果:

type grp val val_a  # pass in `val_a` value of teh group 'a'
1    1   a   1  1
2    1   b   2  1
3    1   d   3  1
4    2   a   8  8
5    2   b   2  8
6    3   b   7 NA
7    3   d   4 NA     # value for 'a' is missing from group 3

您已经接近了第一种方法;使用any将条件应用于组中的所有观测:

dd %>% 
group_by(type) %>% 
mutate(val_a = ifelse(any(grp == "a"), val[grp == "a"] , NA))
type grp     val val_a
<dbl> <chr> <dbl> <dbl>
1     1 a         1     1
2     1 b         2     1
3     1 d         3     1
4     2 a         8     8
5     2 b         2     8
6     3 b         7    NA
7     3 d         4    NA

试试这个:

dd %>% 
group_by(type) %>% 
mutate(val_a2 = val[which(c(grp == 'a'))[1]])
# # A tibble: 7 x 4
# # Groups:   type [3]
#    type grp     val val_a2
#   <dbl> <chr> <dbl>  <dbl>
# 1     1 a         1      1
# 2     1 b         2      1
# 3     1 d         3      1
# 4     2 a         8      8
# 5     2 b         2      8
# 6     3 b         7     NA
# 7     3 d         4     NA

这也控制了可能存在多个匹配的可能性,这可能会导致糟糕的结果(有或没有警告(。

相关内容

最新更新