我想得到每行某些列的平均值.
我有这些数据:
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)
这是一个使用c_across的 tidyverse解决方案,它专为行式聚合而设计。这样可以轻松地按名称、类型或位置引用列,并将任何功能应用于所选列。
\nlibrary("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\nRun Code Online (Sandbox Code Playgroud)\n由reprex 包(v2.0.1)于 2022-06-25 创建
\n