这是原始数据帧的近似值。在原文中,列比此处显示的要多得多。
id init_cont family description value
1 K S impacteach 1
1 K S impactover 3
1 K S read 2
2 I S impacteach 2
2 I S impactover 4
2 I S read 1
3 K D impacteach 3
3 K D impactover 5
3 K D read 3
我想将 impacteach 和 impactover 的值结合起来,生成一个称为 impact 的平均值。我希望最终表如下所示:
id init_cont family description value
1 K S impact 2
1 K S read 2
2 I S impact 3
2 I S read 1
3 K D impact 4
3 K D read 3
我一直无法弄清楚如何生成此表。但是,我已经能够创建一个如下所示的数据帧:
id description value
1 impact 2
1 read 2
2 impact 3
2 read 1
3 impact 4
3 read 3
获取这些新值并将其添加到原始数据帧的最佳方法是什么?我还需要删除原始数据帧中的原始值(如 impacteach 和 impactover)。我更愿意修改原始数据帧,而不是创建一个全新的数据帧,因为原始数据帧有很多列。
如果有用,以下是我用于创建较短数据帧的代码摘要,其中 impacteach 和 impactover 的组合:
df %<%
mutate(newdescription = case_when(description %in% c("impacteach", "impactoverall") ~ "impact", TRUE ~ description)) %<%
group_by(id, newdescription) %<%
summarise(value = mean(as.numeric(value)))
如果您先更改description
列以便它可以包含在分组中,该怎么办:
df %>%
mutate(description = substr(description, 1, 6)) %>%
group_by(id, init_cont, family, description) %>%
summarise(value = mean(value))
# A tibble: 6 x 5
# Groups: id, init_cont, family [?]
# id init_cont family description value
# <int> <chr> <chr> <chr> <dbl>
# 1 1 K S impact 2.
# 2 1 K S read 2.
# 3 2 I S impact 3.
# 4 2 I S read 1.
# 5 3 K D impact 4.
# 6 3 K D read 3.
你只需要修改你的group_by
语句。 试试group_by(id, init_cont, family)
由于您的 id 似乎已映射到init_cont和家人,因此添加这些值不会更改汇总结果。然后,您无需额外工作即可获得所需的所有列。
如果你有很多列,你可以尝试下面的代码。实质上,使用汇总数据对原始数据进行left_join
,但使用.
执行此操作不会存储新数据帧。然后,一旦加入(通过我们修改的 id 和描述),您将有两个值列,它们应该以 .x 和 .y 开头,删除原始列,然后使用 distinct 来删除重复的"影响"列。
df %>%
mutate(description = case_when(description %in% c("impacteach", "impactoverall") ~ "impact", TRUE ~ description)) %>%
left_join(. %>%
group_by(id, description)
summarise(value = mean(as.numeric(value))
,by=c('id','description')) %>%
select(-value.x) %>%
distinct()
gsub
可用于替换包含imact
作为影响的description
,然后从包中group_by
dplyr
将有助于总结值。
df %>% group_by(id, init_cont, family,
description = gsub("^(impact).*","\1", description)) %>%
summarise(value = mean(value))
# # A tibble: 6 x 5
# # Groups: id, init_cont, family [?]
# id init_cont family description value
# <int> <chr> <chr> <chr> <dbl>
# 1 1 K S impact 2.00
# 2 1 K S read 2.00
# 3 2 I S impact 3.00
# 4 2 I S read 1.00
# 5 3 K D impact 4.00
# 6 3 K D read 3.00