按组基于两个不同列的值创建新列

3
我想创建一个“新列”,其中仅包含“number”中的值,用于“sp.name”(分组变量),其中同时存在“young”和“adult”两个响应;如果不存在,则在“新列”中输入0。
df <- data.frame(sp.name= c('a','a', 'b', 'b' ,'c', 'd' ),
                 number=c(2,2,3, 3,4,4),
                 stage= c('adult', 'young', 'young','adult', 'adult', 'young'))

这是我尝试过的。

df %>%
  group_by(sp.name) %>%
  mutate(new_column = ifelse('young' %in% stage & 'adult' %in% stage, 
                                             number[stage == 'adult'], 0))

但是我的代码也将“年轻”(young)的值复制到了新列中,我只想要与“成人”(adult)相关的值。

期望输出:

name number stage new_column
a 2 adult 2
a 2 young 0
b 3 young 0
b 3 adult 3
c 4 adult 0
d 4 young 0
4个回答

2
df %>% 
  group_by(sp.name) %>% 
  mutate(new = (any(stage == 'adult') & any(stage == 'young') & stage == 'adult') * number)

#> # A tibble: 6 x 4
#> # Groups:   sp.name [4]
#>   sp.name number stage   new
#>   <chr>    <dbl> <chr> <dbl>
#> 1 a            2 adult     2
#> 2 a            2 young     0
#> 3 b            3 young     0
#> 4 b            3 adult     3
#> 5 c            4 adult     0
#> 6 d            4 young     0

1

您需要具有以下条件的组:stage == "young""adult"(组级别条件),以及stage == "adult"(行级别条件):

df %>%
  group_by(sp.name) %>%
  mutate(new_column = ifelse(any(stage == "young") & any(stage == "adult") & stage == "adult", 
                             number[stage == 'adult'], 0))

  sp.name number stage new_column
1 a            2 adult          2
2 a            2 young          0
3 b            3 young          0
4 b            3 adult          3
5 c            4 adult          0
6 d            4 young          0

1

使用ifelse条件:

df %>% 
mutate(new_column = ifelse( sp.name == "a" & stage %in% c("young", "adult"), number , 0))

  sp.name number stage new_column
1       a      2 adult          2
2       a      2 young          2
3       b      3 young          0
4       b      3 adult          0
5       c      4 adult          0
6       d      4 young          0

它只输出a的结果,但正如@Maël建议的那样,我正在寻找具有两个响应的所有值的结果。 - Saneesh C S

1

使用 data.table

library(data.table)
setDT(df)[, new_column := number *(all(c("young", "adult") %chin% stage) & 
    stage == "adult"), sp.name]

-输出

> df
   sp.name number stage new_column
1:       a      2 adult          2
2:       a      2 young          0
3:       b      3 young          0
4:       b      3 adult          3
5:       c      4 adult          0
6:       d      4 young          0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接