这是原始数据帧的近似值。在原始版本中,列数多于此处显示的列数。
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'
答案 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