Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在数据帧中重复应用ave计算组平均值_R - Fatal编程技术网

R 在数据帧中重复应用ave计算组平均值

R 在数据帧中重复应用ave计算组平均值,r,R,以下代码根据组分别产生x和y的组平均值。假设我有许多变量,对它们重复相同的操作 为了通过单个命令获得相同的结果,您建议如何继续?(我想有必要采用tapply,但我不是很确定.) x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3) dat假设您有两个以上的列,您可能希望使用apply将ave应用于矩阵中的每一列 x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3) dat <- cbi

以下代码根据
分别产生
x
y
的组平均值。假设我有许多变量,对它们重复相同的操作

为了通过单个命令获得相同的结果,您建议如何继续?(我想有必要采用
tapply
,但我不是很确定.)

x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3)

dat假设您有两个以上的列,您可能希望使用
apply
ave
应用于矩阵中的每一列

x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3)
dat <- cbind(x, y)

ave.dat <- apply(dat, 2, function(column) ave(column, group))
#       x  y
# [1,]  1  2
# [2,]  3  4
# [3,]  5  6
# [4,]  7  8
# [5,]  9 10
# [6,] 11 12
x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3)

dat使用
数据的替代解决方案。表
plyr
包:

1) 使用
数据表

require(data.table)
dt <- data.table(dat, key="group")
# Following @Matthew's comment, edited:
dt[, `:=`(m_x = mean(x), m_y = mean(y)), by=group]
2) 使用
plyr
和变换:

require(plyr)
ddply(dat, .(group), transform, m_x=mean(x), m_y=mean(y))
输出:

  group  x  y m_x m_y
1     1  1  2   3   4
2     1  3  4   3   4
3     1  5  6   3   4
4     2  7  8   9  10
5     2  9 10   9  10
6     2 11 12   9  10
3) 使用
plyr
和numcolwise(注意减少的输出):

输出:

  group x  y
1     1 3  4
2     2 9 10
您还可以使用aggregate():


dat2您是否有两个以上的列要应用此项(不仅仅是x和y)?(如果您只有两个,那么您的解决方案似乎是最简单的——您几乎不需要将其压缩为一个命令)。对不起,我编辑了初始问题请参见下面的答案,这将创建一个新的矩阵,其中每个列都已使用
ave
进行了修改。如果您需要将其放入数据框中(或需要将其放入原始数据框中),则可以非常简单地进行修改。
sapply(dat,ave,dat$group)
。不过,我建议您使用
plyr::ddply
data.table
。谢谢!是否可以直接获得一个数据帧作为最终结果?可以只做
as.data.frame(ave.dat)
非常感谢,非常有启发性+我也是。顺便说一句,您可以在同一分组步骤中通过引用添加两列,以保存分组两次:
dt[,`:=`(m_x=mean(x),m_y=mean(y)),by=group]
  group  x  y m_x m_y
1     1  1  2   3   4
2     1  3  4   3   4
3     1  5  6   3   4
4     2  7  8   9  10
5     2  9 10   9  10
6     2 11 12   9  10
ddply(dat, .(group), numcolwise(mean))
  group x  y
1     1 3  4
2     2 9 10
dat2 <- data.frame(dat, aggregate(dat[,-1], by=list(dat$group), mean)[group, -1])
dat2
    group  x  y x.1 y.1
1       1  1  2   3   4
1.1     1  3  4   3   4
1.2     1  5  6   3   4
2       2  7  8   9  10
2.1     2  9 10   9  10
2.2     2 11 12   9  10
row.names(dat2) <- rownames(dat)
colnames(dat2) <- gsub("(.)\\.1", "m_\\1", colnames(dat2))
dat2
  group  x  y m_x m_y
1     1  1  2   3   4
2     1  3  4   3   4
3     1  5  6   3   4
4     2  7  8   9  10
5     2  9 10   9  10
6     2 11 12   9  10