Dplyr -多列的平均值

628mspwn  于 2023-04-18  发布在  其他
关注(0)|答案(5)|浏览(136)

我想计算几个列的平均值,因此使用dplyr为平均值创建一个新列,而不需要熔化+合并。

  1. > head(growth2)
  2. CODE_COUNTRY CODE_PLOT IV12_ha_yr IV23_ha_yr IV34_ha_yr IV14_ha_yr IV24_ha_yr IV13_ha_yr
  3. 1 1 6 4.10 6.97 NA NA NA 4.58
  4. 2 1 17 9.88 8.75 NA NA NA 8.25
  5. 3 1 30 NA NA NA NA NA NA
  6. 4 1 37 15.43 15.07 11.89 10.00 12.09 14.33
  7. 5 1 41 20.21 15.01 14.72 11.31 13.27 17.09
  8. 6 1 46 12.64 14.36 13.65 9.07 12.47 12.36
  9. >

我需要在数据集中添加一个新列,其中包含所有IV列的平均值。我尝试了以下操作:

  1. growth2 %>%
  2. group_by(CODE_COUNTRY, CODE_PLOT) %>%
  3. summarise(IVmean=mean(IV12_ha_yr:IV13_ha_yr, na.rm=TRUE))

并根据所使用的示例返回了几个错误,例如:

  1. Error in NA_real_:NA_real_ : NA/NaN argument

  1. Error in if (trim > 0 && n) { : missing value where TRUE/FALSE needed
oknwwptz

oknwwptz1#

不需要分组,只需select(),然后mutate()

  1. library(dplyr)
  2. mutate(df, IVMean = rowMeans(select(df, starts_with("IV")), na.rm = TRUE))
6qqygrtg

6qqygrtg2#

这里有一个使用 c_acrossdplyr 解决方案,它是为逐行聚合而设计的。这使得通过名称、类型或位置 * 和 * 引用列以将任何函数应用于所选列变得容易。

  • 注 *:rowwise()是分组操作(即每一行都在自己的组中);我们可以用一个ungroup()反向分组。感谢@Matifou强调这个细节。
  1. library("tidyverse")
  2. df <-
  3. tibble::tribble(
  4. ~CODE_COUNTRY, ~CODE_PLOT, ~IV12_ha_yr, ~IV23_ha_yr, ~IV34_ha_yr, ~IV14_ha_yr, ~IV24_ha_yr, ~IV13_ha_yr,
  5. 1L, 6L, 4.1, 6.97, NA, NA, NA, 4.58,
  6. 1L, 17L, 9.88, 8.75, NA, NA, NA, 8.25,
  7. 1L, 30L, NA, NA, NA, NA, NA, NA,
  8. 1L, 37L, 15.43, 15.07, 11.89, 10, 12.09, 14.33,
  9. 1L, 41L, 20.21, 15.01, 14.72, 11.31, 13.27, 17.09,
  10. 1L, 46L, 12.64, 14.36, 13.65, 9.07, 12.47, 12.36
  11. )
  12. df %>%
  13. rowwise() %>%
  14. mutate(
  15. mean = mean(c_across(starts_with("IV")), na.rm = TRUE),
  16. sd = sd(c_across(starts_with("IV")), na.rm = TRUE)
  17. ) %>%
  18. ungroup()
  19. #> # A tibble: 6 × 10
  20. #> CODE_COUNTRY CODE_PLOT IV12_ha_yr IV23_ha_yr IV34_ha_yr IV14_ha_yr IV24_ha_yr
  21. #> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
  22. #> 1 1 6 4.1 6.97 NA NA NA
  23. #> 2 1 17 9.88 8.75 NA NA NA
  24. #> 3 1 30 NA NA NA NA NA
  25. #> 4 1 37 15.4 15.1 11.9 10 12.1
  26. #> 5 1 41 20.2 15.0 14.7 11.3 13.3
  27. #> 6 1 46 12.6 14.4 13.6 9.07 12.5
  28. #> IV13_ha_yr mean sd
  29. #> <dbl> <dbl> <dbl>
  30. #> 1 4.58 5.22 1.54
  31. #> 2 8.25 8.96 0.835
  32. #> 3 NA NaN NA
  33. #> 4 14.3 13.1 2.14
  34. #> 5 17.1 15.3 3.09
  35. #> 6 12.4 12.4 1.82

创建于2023-04-17带有reprex v2.0.2

展开查看全部
5sxhfpxr

5sxhfpxr3#

在dplyr中使用.

  1. library(dplyr)
  2. mutate(df, IVMean = rowMeans(select(., starts_with("IV")), na.rm = TRUE))
qlvxas9a

qlvxas9a4#

我试图评论里克·斯克里文的答案,但没有经验值。无论如何,想贡献。他的回答说这样做:

  1. library(dplyr)
  2. mutate(df, IVMean = rowMeans(select(df, starts_with("IV")), na.rm = TRUE))

这是可行的,但如果不是所有列都以“IV”开头,这是我的例子,你怎么做?结果,选择不需要逻辑向量,所以你不能使用AND或OR。例如,你不能说“starts_with('X ')|starts_with('Y ')"。您必须构建一个数字向量。以下是如何完成的。

  1. mutate(df, IVMean = rowMeans(select(df, c(starts_with("IV"), starts_with("IX"))), na.rm = TRUE))
xurqigkl

xurqigkl5#

您可以按如下方式使用:
您数据

  1. data<- structure(list(CODE_COUNTRY = c(1L, 1L, 1L, 1L, 1L, 1L), CODE_PLOT = c(6L,
  2. 17L, 30L, 37L, 41L, 46L), IV12_ha_yr = c(4.1, 9.88, NA, 15.43,
  3. 20.21, 12.64), IV23_ha_yr = c(6.97, 8.75, NA, 15.07, 15.01, 14.36
  4. ), IV34_ha_yr = c(NA, NA, NA, 11.89, 14.72, 13.65), IV14_ha_yr = c(NA,
  5. NA, NA, 10, 11.31, 9.07), IV24_ha_yr = c(NA, NA, NA, 12.09, 13.27,
  6. 12.47), IV13_ha_yr = c(4.58, 8.25, NA, 14.33, 17.09, 12.36)), .Names = c("CODE_COUNTRY",
  7. "CODE_PLOT", "IV12_ha_yr", "IV23_ha_yr", "IV34_ha_yr", "IV14_ha_yr",
  8. "IV24_ha_yr", "IV13_ha_yr"), class = "data.frame", row.names = c("1",
  9. "2", "3", "4", "5", "6"))
  10. mydata <- cbind(data,IVMean=apply(data[,3:8],1,mean, na.rm=TRUE))

你也可以这样做

  1. mydata <- cbind(data,IVMean=rowMeans(data[3:8], na.rm=TRUE))
展开查看全部

相关问题