Dplyr - 多列的平均值

fed*_*ppi 12 r dplyr

我想计算几列的平均值,创建一个新列,使用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)

  • 目前这不起作用(R 3.2.0 和 dplyr 0.4.1)。我收到以下错误:错误:每个参数必须产生正整数或负整数 (2认同)

dip*_*kov 15

这是使用c_across的 dplyr解决方案,它专为行式聚合而设计。这样可以轻松地按名称、类型或位置引用列并将任何功能应用于所选列。

\n

注意rowwise()是分组操作(即每一行都在自己的组中);我们可以用 反转分组ungroup()。感谢@Matifou 强调了这个细节。

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

创建于 2023-04-17,使用reprex v2.0.2

\n


Shi*_*ang 5

.在 dplyr 中使用。

library(dplyr)
mutate(df, IVMean = rowMeans(select(., starts_with("IV")), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)