r - 对允许 NA 的行和列进行平均

标签 r

我的数据框是这样的:

> df
  id u.1t u.2 v.1 v.2
1  A    1  NA   5  NA
2  A    2  NA   4   6
3  A    1   4   5  NA
4  B   10  13  40  NA
5  B   10  12  42  NA
6  B   10  NA  41  NA

我想分别知道 u.*v.* 列的 id 特定方法,如下所示:

> mean
  id u.mean v.mean
1  A      2      5
2  B     11     41

这是数据

df<-data.frame(id=c("A","A","A","B","B","B"),u.1t=c(1,2,1,10,10,10),u.2=c(NA,NA,4,13,12,NA),v.1=c(5,4,5,40,42,41),v.2=c(NA,6,NA,NA,NA,NA))

很明显,通过引入 NA,总体均值不等于行或列均值的均值,这就是这里的问题。

我以为这是 by 的工作,但事实证明我不能让 by 做任何事情,只能按列操作?

非常感谢帮助--谢谢

最佳答案

如果你想使用by,试试这样:

by(x, x$id, function(x) colMeans(x[,-1], na.rm=TRUE))

输出有点难看。虽然你可以整理它,但我会使用 plyr 包:

library(plyr)
ddply(x, .(id), function(x) colMeans(x[,-1], na.rm=TRUE))

这并不能完全实现你所追求的,因为它取了每列的平均值:它没有结合 u.*v.*列。为此,我会先融化数据,然后使用plyr:

library(reshape2)
y <- melt(x)
y$variable <- gsub("\\..*", '', y$variable)
y
#   id variable value
#1   A        u     1
#2   A        u     2
#3   A        u     1
#4   B        u    10
#5   B        u    10
#6   B        u    10
#7   A        u    NA
#    (etc)

z <- ddply(y, .(id, variable), summarise, mean = mean(value, na.rm=TRUE))
z
#  id variable mean
#1  A        u    2
#2  A        v    5
#3  B        u   11
#4  B        v   41

如果您愿意,您可以强制转换:

dcast(z, id~variable)
#  id  u  v
#1  A  2  5
#2  B 11 41    

关于r - 对允许 NA 的行和列进行平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494076/

相关文章:

r - 将 ggsurvplot 中的 xlim 更改为笛卡尔坐标

r - 在 ggplot 上覆盖 mustache 或错误栏式线条

r - 双变量椭圆中的观察

r - 如何使用 r 中的 igraph 分别计算不同时期的网络测量值?

r - 使用 sparklyr 将字符串/字符转换为日期

r - 如何用单个值替换数据框中每行的最大值

r - 填写缺失的时间步长 (yyyy-mm-dd HH :MM:SS) by adding rows with missing times in R

r - 使用dplyr时使用rle按运行分组

r - 如何将 2 个单独的分类变量编码为 R 中的一个?

r - 使用键盘输入中断循环 (R)