繁体   English   中英

dplyr:基于分组创建新变量

[英]dplyr: create new variable based upon grouping

给定此数据框:

library(dplyr)
df.ex <- tibble(id = c(rep(1, 4), rep(2, 4), rep(3, 4)),
var1 = c('a','a','b','b','a','a','a','a','b','b','b','b'))

我想基于由id列分组的var1b的存在创建一个新变量var2 因此,每个id只能在输出列中包含一种类型的值。 这是希望的结果:

df.ex.outcome <- tibble(id = c(rep(1, 4), rep(2, 4), rep(3, 4)),
            var1 = c('a','a','b','b','a','a','a','a','b','b','b','b'),
            var2 = c(rep('foo', 4), rep('bar', 4), rep('foo', 4)))

我以为使用group_by可以解决此问题,但是它似乎不起作用,如下所示:

df.ex <- df.ex %>% group_by(id) %>% mutate(var2 = if_else(var1 %in% 'b', 'foo','bar'))

有人对如何执行此操作有任何想法吗?

我们可以包装any

df.ex %>% 
  group_by(id) %>%
  mutate(var2 = case_when(any(var1 == "b")~ "foo", TRUE ~ "bar"))
# A tibble: 12 x 3
# Groups:   id [3]
#      id var1  var2 
#   <dbl> <chr> <chr>
# 1     1 a     foo  
# 2     1 a     foo  
# 3     1 b     foo  
# 4     1 b     foo  
# 5     2 a     bar  
# 6     2 a     bar  
# 7     2 a     bar  
# 8     2 a     bar  
# 9     3 b     foo  
#10     3 b     foo  
#11     3 b     foo  
#12     3 b     foo  

或反转%in%的参数

df.ex %>% 
   group_by(id) %>% 
   mutate(var2 = case_when("b" %in% var1 ~ "foo", TRUE ~ "bar"))

或使用if_else

df.ex %>% 
      group_by(id) %>% 
      mutate(var2 = if_else('b' %in% var1, 'foo','bar'))

这样%in%会有一个TRUE / FALSE输出,我们也可以将它与if/else

df.ex %>%
    group_by(id) %>%
    mutate(var2 = if("b" %in% var1) "foo" else "bar")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM