我想计算几列的平均值,创建一个新列,使用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
>
Run Code Online (Sandbox Code Playgroud)
我需要数据集中的新列,其中包含所有IV列的平均值.我试过这个:
growth2 %>%
group_by(CODE_COUNTRY, CODE_PLOT) %>%
summarise(IVmean=mean(IV12_ha_yr:IV13_ha_yr, na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)
并根据使用的示例返回了几个错误,例如:
Error in NA_real_:NA_real_ : NA/NaN argument
Run Code Online (Sandbox Code Playgroud)
要么
Error in if (trim > 0 && n) { : missing value where TRUE/FALSE needed
Run Code Online (Sandbox Code Playgroud)
Ric*_*ven 17
你并不需要组,只需select()再mutate()
library(dplyr)
mutate(df, IVMean = rowMeans(select(df, starts_with("IV")), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)
dip*_*kov 15
这是使用c_across的 dplyr解决方案,它专为行式聚合而设计。这样可以轻松地按名称、类型或位置引用列,并将任何功能应用于所选列。
\n注意:rowwise()是分组操作(即每一行都在自己的组中);我们可以用 反转分组ungroup()。感谢@Matifou 强调了这个细节。
library("tidyverse")\n\ndf <-\n tibble::tribble(\n ~CODE_COUNTRY, ~CODE_PLOT, ~IV12_ha_yr, ~IV23_ha_yr, ~IV34_ha_yr, ~IV14_ha_yr, ~IV24_ha_yr, ~IV13_ha_yr,\n 1L, 6L, 4.1, 6.97, NA, NA, NA, 4.58,\n 1L, 17L, 9.88, 8.75, NA, NA, NA, 8.25,\n 1L, 30L, NA, NA, NA, NA, NA, NA,\n 1L, 37L, 15.43, 15.07, 11.89, 10, 12.09, 14.33,\n 1L, 41L, 20.21, 15.01, 14.72, 11.31, 13.27, 17.09,\n 1L, 46L, 12.64, 14.36, 13.65, 9.07, 12.47, 12.36\n )\n\ndf %>%\n rowwise() %>%\n mutate(\n mean = mean(c_across(starts_with("IV")), na.rm = TRUE),\n sd = sd(c_across(starts_with("IV")), na.rm = TRUE)\n ) %>%\n ungroup()\n#> # A tibble: 6 \xc3\x97 10\n#> CODE_COUNTRY CODE_PLOT IV12_ha_yr IV23_ha_yr IV34_ha_yr IV14_ha_yr IV24_ha_yr\n#> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>\n#> 1 1 6 4.1 6.97 NA NA NA \n#> 2 1 17 9.88 8.75 NA NA NA \n#> 3 1 30 NA NA NA NA NA \n#> 4 1 37 15.4 15.1 11.9 10 12.1\n#> 5 1 41 20.2 15.0 14.7 11.3 13.3\n#> 6 1 46 12.6 14.4 13.6 9.07 12.5\n#> IV13_ha_yr mean sd\n#> <dbl> <dbl> <dbl>\n#> 1 4.58 5.22 1.54 \n#> 2 8.25 8.96 0.835\n#> 3 NA NaN NA \n#> 4 14.3 13.1 2.14 \n#> 5 17.1 15.3 3.09 \n#> 6 12.4 12.4 1.82\nRun Code Online (Sandbox Code Playgroud)\n创建于 2023-04-17,使用reprex v2.0.2
\n.在 dplyr 中使用。
library(dplyr)
mutate(df, IVMean = rowMeans(select(., starts_with("IV")), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)