【问题标题】:dplyr mutate with null valuedplyr 变异为空值
【发布时间】:2018-07-12 09:20:43
【问题描述】:

我有一个数据框,我想使用 mutate 填充一个“e_value”列,该列是“e”指标的值within组,所以我使用 dplyr 和 group_by group 然后使用 value[metric == "e"] 进行变异,但是当组内没有 metric == e 时,这将返回错误,如下面的组 C 中所示。当没有 e 指标时,有没有办法只返回 f 指标?

library(dplyr)

# this code does not work because there is no e metric in group C
data =data.frame(group = c("A","A","B","B","C"),metric=c("e","f","e","f","f"),value = c(1,2,3,4,5))
data %>% group_by(group) %>% mutate( e_value = value[metric == "e"]  )



##  this code below  work becuase there is always an e metric
    data =data.frame(group = c("A","A","B","B"),metric=c("e","f","e","f"),value = c(1,2,3,4))
    data %>% group_by(group) %>% mutate( e_value = value[metric == "e"]  )

【问题讨论】:

  • 第一个示例的预期输出是什么?
  • 这是你想要的吗:data %>% group_by(group) %>% filter(metric == "e")?

标签: r dplyr


【解决方案1】:

您可以插入ifelse 以使其成为条件。

data %>%
  group_by(group) %>%
  mutate(
    e_value = ifelse(is.null(value[metric == "e"]), NA, value[metric == "e"])
  )

# # A tibble: 5 x 4
# # Groups:   group [3]
#   group metric value e_value
#   <fct> <fct>  <dbl>   <dbl>
# 1 A     e       1.00    1.00
# 2 A     f       2.00    1.00
# 3 B     e       3.00    3.00
# 4 B     f       4.00    3.00
# 5 C     f       5.00   NA  

【讨论】:

  • 你能组成第 5 组吗?
  • @user3022875,这取决于你的规则......你的测试用例中只有一个可能的值......所以你可以简单地将我的ifelse中的NA替换为value .但是,如果有多个选项,您会选择哪一个?你可以使用first(value),或last,或mean...任何适合你的要求。 @maurits-evers 的替代解决方案实际上是相同的。
【解决方案2】:

或者像这样使用%in%:

data %>% group_by(group) %>% mutate(e_value = ifelse("e" %in% metric, value, NA));
## A tibble: 5 x 4
## Groups:   group [3]
#   group metric value e_value
#  <fctr> <fctr> <dbl>   <dbl>
#1      A      e     1       1
#2      A      f     2       1
#3      B      e     3       3
#4      B      f     4       3
#5      C      f     5      NA

【讨论】:

  • @user3022875 这不是很合乎逻辑的 IMO;但你可以做data %&gt;% group_by(group) %&gt;% mutate(e_value = ifelse("e" %in% metric, value, NA)) %&gt;% mutate(e_value = replace(e_value, is.na(e_value), value))
猜你喜欢
  • 2020-01-16
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2018-11-30
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多