我想计算几个列的平均值,因此使用dplyr
为平均值创建一个新列,而不需要熔化+合并。
> head(growth2)
CODE_COUNTRY CODE_PLOT IV12_ha_yr IV23_ha_yr IV34_ha_yr IV14_ha_yr IV24_ha_yr IV13_ha_yr
1 1 6 4.10 6.97 NA NA NA 4.58
2 1 17 9.88 8.75 NA NA NA 8.25
3 1 30 NA NA NA NA NA NA
4 1 37 15.43 15.07 11.89 10.00 12.09 14.33
5 1 41 20.21 15.01 14.72 11.31 13.27 17.09
6 1 46 12.64 14.36 13.65 9.07 12.47 12.36
>
我需要在数据集中添加一个新列,其中包含所有IV列的平均值。我尝试了以下操作:
growth2 %>%
group_by(CODE_COUNTRY, CODE_PLOT) %>%
summarise(IVmean=mean(IV12_ha_yr:IV13_ha_yr, na.rm=TRUE))
并根据所使用的示例返回了几个错误,例如:
Error in NA_real_:NA_real_ : NA/NaN argument
或
Error in if (trim > 0 && n) { : missing value where TRUE/FALSE needed
5条答案
按热度按时间oknwwptz1#
不需要分组,只需
select()
,然后mutate()
6qqygrtg2#
这里有一个使用 c_across 的 dplyr 解决方案,它是为逐行聚合而设计的。这使得通过名称、类型或位置 * 和 * 引用列以将任何函数应用于所选列变得容易。
rowwise()
是分组操作(即每一行都在自己的组中);我们可以用一个ungroup()
反向分组。感谢@Matifou强调这个细节。创建于2023-04-17带有reprex v2.0.2
5sxhfpxr3#
在dplyr中使用
.
。qlvxas9a4#
我试图评论里克·斯克里文的答案,但没有经验值。无论如何,想贡献。他的回答说这样做:
这是可行的,但如果不是所有列都以“IV”开头,这是我的例子,你怎么做?结果,选择不需要逻辑向量,所以你不能使用AND或OR。例如,你不能说“starts_with('X ')|starts_with('Y ')"。您必须构建一个数字向量。以下是如何完成的。
xurqigkl5#
您可以按如下方式使用:
您数据
你也可以这样做