如何获得所选列的平均值(平均值)

the*_*ist 24 r

我想得到每行某些列的平均值.

我有这些数据:

w=c(5,6,7,8)
x=c(1,2,3,4)
y=c(1,2,3)
length(y)=4
z=data.frame(w,x,y)
Run Code Online (Sandbox Code Playgroud)

哪个回报:

  w x  y
1 5 1  1
2 6 2  2
3 7 3  3
4 8 4 NA
Run Code Online (Sandbox Code Playgroud)

我想得到某些列的意思,而不是所有列.我的问题是我的数据中有很多NA.所以如果我想要x和y的平均值,这就是我想要回来的:

  w x  y mean
1 5 1  1    1
2 6 2  2    2
3 7 3  3    3
4 8 4 NA    4
Run Code Online (Sandbox Code Playgroud)

我想我可以做类似的事情,z$mean=(z$x+z$y)/2但y的最后一行是NA,所以很明显我不想计算NA,我不应该除以2.我试过cumsum但当该行中有一个NA时返回NAs.我想我正在寻找能够添加所选列的内容,忽略NAs,获取没有NA的所选列的数量并除以该数字.我试过??意思和平均而且完全难倒.

ETA:还有一种方法可以为特定列添加权重吗?

koh*_*ske 38

这里有些例子:

> z$mean <- rowMeans(subset(z, select = c(x, y)), na.rm = TRUE)
> z
  w x  y mean
1 5 1  1    1
2 6 2  2    2
3 7 3  3    3
4 8 4 NA    4
Run Code Online (Sandbox Code Playgroud)

加权平均数

> z$y <- rev(z$y)
> z
  w x  y mean
1 5 1 NA    1
2 6 2  3    2
3 7 3  2    3
4 8 4  1    4
> 
> weight <- c(1, 2) # x * 1/3 + y * 2/3
> z$wmean <- apply(subset(z, select = c(x, y)), 1, function(d) weighted.mean(d, weight, na.rm = TRUE))
> z
  w x  y mean    wmean
1 5 1 NA    1 1.000000
2 6 2  3    2 2.666667
3 7 3  2    3 2.333333
4 8 4  1    4 2.000000
Run Code Online (Sandbox Code Playgroud)


And*_*rew 19

尝试使用rowMeans:

z$mean=rowMeans(z[,c("x", "y")], na.rm=TRUE)

  w x  y mean
1 5 1  1    1
2 6 2  2    2
3 7 3  3    3
4 8 4 NA    4
Run Code Online (Sandbox Code Playgroud)


dip*_*kov 5

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

\n
library("tidyverse")\n\nw <- c(5, 6, 7, 8)\nx <- c(1, 2, 3, 4)\ny <- c(1, 2, 3, NA)\nz <- data.frame(w, x, y)\n\nz %>%\n  rowwise() %>%\n  mutate(\n    mean = mean(c_across(c(x, y)), na.rm = TRUE),\n    max = max(c_across(x:y), na.rm = TRUE)\n  )\n#> # A tibble: 4 \xc3\x97 5\n#> # Rowwise: \n#>       w     x     y  mean   max\n#>   <dbl> <dbl> <dbl> <dbl> <dbl>\n#> 1     5     1     1     1     1\n#> 2     6     2     2     2     2\n#> 3     7     3     3     3     3\n#> 4     8     4    NA     4     4\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包(v2.0.1)于 2022-06-25 创建

\n