将新的组合值添加到 R 中的现有数据帧



这是原始数据帧的近似值。在原文中,列比此处显示的要多得多。

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_bydplyr将有助于总结值。

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

最新更新