将其中包含列表的 data.frame 转换为数值向量
Convert data.frame with lists in it to nummerical vectors
数据是一个 data.frame,有 3199 行和 30 列。我有来自不同地点的不同地块和特定年份的年度数据,其中包含许多变量。
我现在想按位置和年份计算特定变量的平均值。数据是什么样的:
year location variable1 variable2 ...
1923 1013
1924 1013
1925 1013
. .
. .
1930 1014
所以我首先按年份和位置拆分数据。现在我想计算平均值。这是以下代码的作用:
data<-lapply(data, function(x){lapply(x,function(y)
{m<-sum(variable1)/length(y$variable1)
calculatedmean<-rbind(calculatedmean,m)})})
之后我想将结果返回到 data.frame,这就是以下代码应该做的:
calculatedmean<-rbind.fill(lapply(calculatedmean,function(x)
{as.data.frame(t(x),stringsAsFactors=FALSE)}))
我需要使用 plyr 包中的 rbind.fill,因为结果的长度不同。我得到的是一个 data.frame 里面有列表。看起来像:
colname1 colname2 colname3 ...
list(x0.00029 = 0.00029) NULL NULL
list(X0.000313 = 0.000313) NULL NULL
list(X0.000272 = 0.000272) list(X0.000625 = 0.000625) NULL
. . .
. . .
我想用数据 [1,1] 的计算平均值替换列表元素,例如它是 0.00029。我想保留 data.frame 的格式,其中 NULL 应该是 NA。我试过:
t(as.data.frame(sapply(caluculatedmean,function(x) unname(unlist(x)))))
但这行不通,因为列的长度不同。我认为解决方案应该不会太复杂,但我现在想不出来..
我终于做到了,我觉得方法有点复杂,但对我有用:
我首先借助 plyr 包按位置和年份拆分数据。
means<-ddply(data, c("location", "year"),summarise, mean = mean(variable1, na.rm=TRUE))
之后,我希望每年在一个专栏中有一个 data.frame 的方法。所以按位置拆分。
a<-split(a, a$location)
我使用 zoo 包 制作时间序列对象,然后将它们放入 data.frame。
a<-lapply(a, function(x){
assign(paste(x$location[1]),zoo(x$mean, x$year))
})
a<-do.call("merge", a)
数据是一个 data.frame,有 3199 行和 30 列。我有来自不同地点的不同地块和特定年份的年度数据,其中包含许多变量。 我现在想按位置和年份计算特定变量的平均值。数据是什么样的:
year location variable1 variable2 ...
1923 1013
1924 1013
1925 1013
. .
. .
1930 1014
所以我首先按年份和位置拆分数据。现在我想计算平均值。这是以下代码的作用:
data<-lapply(data, function(x){lapply(x,function(y)
{m<-sum(variable1)/length(y$variable1)
calculatedmean<-rbind(calculatedmean,m)})})
之后我想将结果返回到 data.frame,这就是以下代码应该做的:
calculatedmean<-rbind.fill(lapply(calculatedmean,function(x)
{as.data.frame(t(x),stringsAsFactors=FALSE)}))
我需要使用 plyr 包中的 rbind.fill,因为结果的长度不同。我得到的是一个 data.frame 里面有列表。看起来像:
colname1 colname2 colname3 ...
list(x0.00029 = 0.00029) NULL NULL
list(X0.000313 = 0.000313) NULL NULL
list(X0.000272 = 0.000272) list(X0.000625 = 0.000625) NULL
. . .
. . .
我想用数据 [1,1] 的计算平均值替换列表元素,例如它是 0.00029。我想保留 data.frame 的格式,其中 NULL 应该是 NA。我试过:
t(as.data.frame(sapply(caluculatedmean,function(x) unname(unlist(x)))))
但这行不通,因为列的长度不同。我认为解决方案应该不会太复杂,但我现在想不出来..
我终于做到了,我觉得方法有点复杂,但对我有用:
我首先借助 plyr 包按位置和年份拆分数据。
means<-ddply(data, c("location", "year"),summarise, mean = mean(variable1, na.rm=TRUE))
之后,我希望每年在一个专栏中有一个 data.frame 的方法。所以按位置拆分。
a<-split(a, a$location)
我使用 zoo 包 制作时间序列对象,然后将它们放入 data.frame。
a<-lapply(a, function(x){
assign(paste(x$location[1]),zoo(x$mean, x$year))
})
a<-do.call("merge", a)