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

时间:2018-04-26 17:43:29

标签: r tidyverse mutate

这是原始数据帧的近似值。在原始版本中,列数多于此处显示的列数。

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

我想结合impacteach和impactover的值来生成一个叫做影响的平均值。我希望决赛桌看起来如下:

id  description  value
1   impact       2
1   read         2
2   impact       3
2   read         1
3   impact       4
3   read         3

我无法弄清楚如何生成此表。但是,我已经能够创建一个如下所示的数据框:

df %<%
  mutate(newdescription = case_when(description %in% c("impacteach", "impactoverall") ~ "impact", TRUE ~ description)) %<% 
  group_by(id, newdescription) %<%
  summarise(value = mean(as.numeric(value)))

将这些新值添加到原始数据框中的最佳方法是什么?我还需要删除原始数据帧中的原始值(如impacteach和impactover)。我宁愿修改原始数据框而不是创建一个全新的数据框,因为原始数据框有很多列。

如果它有用,这是我用来创建具有影响的较短数据帧的代码的摘要,作为impacteach和impactover的组合:

>>> np.array(['10', '20', 'a'], dtype=int)
...
ValueError: invalid literal for int() with base 10: 'a'

3 个答案:

答案 0 :(得分:4)

如果您先更改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.

答案 1 :(得分:1)

您只需修改group_by声明即可。试试group_by(id, init_cont, family)

因为你的id似乎已经映射到init_cont和family,所以添加这些值不会改变你的汇总结果。然后你就拥有了你想要的所有列而没有额外的工作。

如果你有 lot 列,你可以尝试类似下面的代码。从本质上讲,使用汇总数据对原始数据执行left_join,但使用.执行此操作不会存储新数据帧。然后,一旦加入(通过我们在适当位置修改的id和描述),你将有两个值列,应该预先添加.x和.y,删除原始,然后使用distinct来摆脱重复& #39;冲击&#39;列。

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()

答案 2 :(得分:0)

gsub可用于替换包含description的{​​{1}}作为影响,然后来自imact包的group_by将有助于总结该值。

dplyr