子集存储在列表中的数据帧
Posted
技术标签:
【中文标题】子集存储在列表中的数据帧【英文标题】:Subsetting dataframes stored in a list 【发布时间】:2015-04-12 10:43:08 【问题描述】:我很难弄清楚如何从存储在列表中的数据帧中对某些特定数据进行子集化。我已经阅读了该网站以及 UCLA 和 Adv-R 上的大量文章,但我没有取得任何进展。
Advanced-R for Subsetting UCLA Advanced R for Subsetting
我的函数读入有助于识别我有兴趣从一系列文件中提取哪些数据的参数。所以,dat1、dat2 和 dat3 在文件 1:15 中存储在一个文件目录 (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 值,或“list()”,或者只是设置对象不能是子集的错误,或者子集缺少参数。我已经尝试过子集、括号表示法。
您如何建议我获取数据帧列表的一个子集,以便我将所有 dat1 或 dat2 恢复到一个可以计算平均值的向量中?
感谢您的时间和考虑。
【问题讨论】:
我猜你可以使用类似 lapply(x,[[
,'dat1') 的东西,它会返回一个与每个数据帧中的 'dat1' 列相对应的向量列表跨度>
您尝试的代码到底是什么导致了错误?我认为unlist(lapply(x, "[[", "dat1"))
可能会起作用。一个实际的reproducible example 在这里比仅仅描述结构更有用。
你好@mrflick 这是一个观察样本 1. Date dat1 dat2 ID 10/11/2003 NA NA 1 10/12/2003 5.99 0.428 1 10/13/2003 NA NA 1 10/14/ 2003 NA NA 1 10/15/2003 NA NA 1 10/16/2003 NA NA 1 10/17/2003 NA NA 1 10/18/2003 4.68 1.04 1 10/19/2003 NA NA 1 10/20/2003 NA NA 1 10/21/2003 NA NA 1 10/22/2003 NA NA 1 10/23/2003 NA NA 1 10/24/2003 3.47 0.363 1 10/25/2003 NA NA 1 10/26/2003 NA NA 1 2003 年 10 月 27 日 NA NA 1 10/28/2003 NA NA 1 10/29/2003 NA NA 1 2003 年 10 月 30 日 2.42 0.507 1
@MrFlick 我试过你的方法,它只返回“NULL”,这让我相信我的 dat1 参数实际上并没有被使用。我知道如果我做一个简单的 print(dat1) 它会给我函数内的参数。 y
您在 cmets 上面发布的内容不是可重现的示例。尝试dput()
-ing 示例对象或在您的原始问题中构建示例列表。阅读我为其他示例提供的链接。与您所描述的情况肯定有所不同。
【参考方案1】:
我喜欢 plyr 的这种东西。如果你想要每个 data.frame 的平均值,我会做这样的事情:
library(plyr)
ldply(x, summarize, Mean = mean(dat1))
或者,如果你想要一个包含所有 dat1 列的长向量,并且想要取所有列的平均值,我仍然会使用 plyr,但这样做:
x <- rbind.fill(x)
mean(x$dat1)
【讨论】:
【参考方案2】:创建一个类似的数据集:
> 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
【讨论】:
您好 Edzer,感谢您的反馈。当我按照您的方式进行操作时,出现以下错误:警告消息:在 mean.default(do.call(c, lapply(x, function(X) X$dat1)), : 参数不是数字或逻辑:返回 NA dat1 是传递给函数的参数,确保函数只选择 dat1 进行矢量化和均值计算。 我的函数一般来说肯定有问题,因为如果我尝试提供的示例列表,我可以毫无问题地对其进行子集化。均值函数仍然不起作用,但至少子集起作用。所以这给了我更多探索的东西。 此警告表明某些 dat1 向量不是数字,而是例如因子,与您在上面显示的不同。我建议建立一个检查这个问题。以上是关于子集存储在列表中的数据帧的主要内容,如果未能解决你的问题,请参考以下文章