我很难弄清楚如何从列表中存储的数据帧中对某些特定数据进行子集化。我已经阅读了本网站以及UCLA和Adv-R上的大量文章,而且我没有取得任何进展。
Advanced-R for Subsetting UCLA Advanced R for Subsetting
我的函数读入的参数可以帮助它识别我有兴趣在一系列文件中提取的数据。因此,文件1:15中的dat1,dat2和dat3存储在文件目录中(1:999)。
使用lapply和read.CSV我已将所有文件(1:15)读入数据帧列表。
x <- lapply(directory[id], function(i) {
read.csv(i, header = TRUE)
} )
一个例子看起来像是str(x)[只是第一个元素]:
List of 15
$ :'data.frame': 1461 obs. of 4 variables:
..$ DateObv : Factor w/ 1461 levels "2003-01-01","2003-01-02",..: 1 2 3 4 5 6 7 8 9 10 ...
..$ dat1: num [1:1461] NA NA NA NA NA NA NA NA NA NA ...
..$ dat2: num [1:1461] NA NA NA NA NA NA NA NA NA NA ...
..$ ID : int [1:1461] 1 1 1 1 1 1 1 1 1 1 ...
所以在我的函数的参数中,我想告诉它从文件1:15给我dat1然后我会做结果的平均值。
我想也许我可以使用另一个lapply将dat1特定地子集化到一个向量中,但它会一直返回一个NULL值,或者#34; list()&#34;或者只是设置对象的错误不能是子集,或者缺少参数的子集。我试过了子集,括号表示法。
您如何建议我获取数据帧列表的子集,以便将所有dat1或dat2取回到一个可以对其进行平均反对的向量中?
感谢您的时间和考虑。
答案 0 :(得分:1)
我喜欢这种事情。如果你想要每个data.frame的平均值,我会做这样的事情:
library(plyr)
ldply(x, summarize, Mean = mean(dat1))
或者,如果你想要所有dat1列的长向量并且你想要取所有这些列的平均值,我仍然会使用plyr但是这样做:
x <- rbind.fill(x)
mean(x$dat1)
答案 1 :(得分:0)
创建一个类似的数据集:
> x = list(data.frame(dat1 = 1:3,dat2=10), data.frame(dat1 = 2:4,dat2=10))
> str(x)
List of 2
$ :'data.frame': 3 obs. of 2 variables:
..$ dat1: int [1:3] 1 2 3
..$ dat2: num [1:3] 10 10 10
$ :'data.frame': 3 obs. of 2 variables:
..$ dat1: int [1:3] 2 3 4
..$ dat2: num [1:3] 10 10 10
使用lapply选择变量dat1
:
> lapply(x, function(X) X$dat1)
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3 4
将结果列表绑定到包含c
的向量,在结果向量上调用mean
,然后添加na.rm=TRUE
以删除NA
值:
> mean(do.call(c, lapply(x, function(X) X$dat1)),na.rm=TRUE)
[1] 2.5