Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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 Colmeans按因子变量在数据帧中_R_Dataframe_Data.table_Plyr - Fatal编程技术网

R Colmeans按因子变量在数据帧中

R Colmeans按因子变量在数据帧中,r,dataframe,data.table,plyr,R,Dataframe,Data.table,Plyr,我试图得到数据框中不同因素的一些变量的平均值。假设我有: time geo var1 var2 var3 var4 1 1990 AT 1 7 13 19 2 1991 AT 2 8 14 20 3 1992 AT 3 9 15 21 4 1990 DE 4 10 16 22 5 1

我试图得到数据框中不同因素的一些变量的平均值。假设我有:

    time    geo var1    var2   var3    var4
1   1990    AT  1       7      13       19
2   1991    AT  2       8      14       20
3   1992    AT  3       9      15       21
4   1990    DE  4       10     16       22
5   1991    DE  5       11     17       23
6   1992    DE  6       12     18       24
我想:

    time    geo var1    var2   var3    var4   m_var2   m_var3
1   1990    AT  1       7      13       19    8        14
2   1991    AT  2       8      14       20    8        14
3   1992    AT  3       9      15       21    8        14
4   1990    DE  4       10     16       22    11       17
5   1991    DE  5       11     17       23    11       17
6   1992    DE  6       12     18       24    11       17
我用by()和lappy()做了一些尝试,但我认为这是ddply的方向

require(plyr)
Dataset <- data.frame(time=rep(c(1990:1992),2),geo=c(rep("AT",3),rep("DE",3))
      ,var1=as.numeric(c(1:6)),var2=as.numeric(c(7:12)),var3=as.numeric(c(13:18)),
      var4=as.numeric(c(19:24)))

newvars <- c("var2","var3")
newData <- Dataset[,c("geo",newvars)]
我的lapply尝试让我走了很远,但给我留下了一个无法返回数据帧的列表:

lapply(newvars,function(x){
       by(Dataset[x],Dataset[,"geo"],function(x) 
       rep(colMeans(x,na.rm=T),length(unique(Dataset[,"time"]))))
       })
我认为,这甚至必须能够与合并和过滤器如下:
,但我不能把它整理好。任何帮助都将不胜感激

一个选项是使用
data.table
。我们可以将
data.frame
转换为
data.table
setDT(df1)
),通过在
.SDcols
中指定按“geo”分组的列索引,获得所选列(
lapply(.SD,mean)
)的
平均值。通过将输出(
:=
)分配给新列名(
粘贴('m',名称(df1)[4:5])来创建新列

注意:此方法更通用。我们可以创建
mean
列,即使是100秒的变量,代码中也没有任何重大变化。也就是说,如果我们需要获得第4:100列的
平均值,请更改
.SDcols=4:100
并在
粘贴('m',names(df1)[4:100]

数据
df1使用
dplyr的其他方法

library(dplyr)
df1 %>% group_by(geo) %>% mutate(m_var2=mean(var2), m_var3=mean(var3))

base
R中:

 cbind(df1,m_var2=ave(df1$var2,df1$geo),m_var3=ave(df1$var3,df1$geo))

另一个简单的BaseR解决方案是

transform(df, m_var2 = ave(var2, geo), m_var3 = ave(var3, geo))
#   time geo var1 var2 var3 var4 m_var2 m_var3
# 1 1990  AT    1    7   13   19      8     14
# 2 1991  AT    2    8   14   20      8     14
# 3 1992  AT    3    9   15   21      8     14
# 4 1990  DE    4   10   16   22     11     17
# 5 1991  DE    5   11   17   23     11     17
# 6 1992  DE    6   12   18   24     11     17

几年后,我认为更简洁的方法是更新实际数据集(而不是创建新数据集)和操作列向量(而不是手动编写)


vars@DavidArenburg是吗?好的,我会指定它。这很好,谢谢!我可以让它通过我指定的变量向量运行,这正是我所需要的。@Jakob我希望保留错误的代码,以便其他人理解是非。但是,如果你愿意,你可以删除它
library(dplyr)
df1 %>% group_by(geo) %>% mutate(m_var2=mean(var2), m_var3=mean(var3))
 cbind(df1,m_var2=ave(df1$var2,df1$geo),m_var3=ave(df1$var3,df1$geo))
transform(df, m_var2 = ave(var2, geo), m_var3 = ave(var3, geo))
#   time geo var1 var2 var3 var4 m_var2 m_var3
# 1 1990  AT    1    7   13   19      8     14
# 2 1991  AT    2    8   14   20      8     14
# 3 1992  AT    3    9   15   21      8     14
# 4 1990  DE    4   10   16   22     11     17
# 5 1991  DE    5   11   17   23     11     17
# 6 1992  DE    6   12   18   24     11     17
vars <- paste0("var", 2:3) # Select desired cols
df[paste0("m_", vars)] <- lapply(df[vars], ave, df[["geo"]]) # Loop and update