我有一个310个数据帧的列表,mrns[[i]]
,我基于一个因子mrns[[i]]$ar.cat
的值进行子集。我能够以一种方式使用它们的子集,即那些不匹配条件的数据帧留下0个观察值,但我希望代码只是删除这些数据帧,而不是将它们留在新列表中为空。
arlow <- lapply(mrns, function(x) subset(x, x$ar.cat[1] == "Arousals Index: LOW"))
这给了我:
length(arlow)
[1] 310
当我看到arlow
列表的内容时,我看到不满足条件的data.frames:
[[98]]
[1] raw.Number raw.Reading_Status raw.Month raw.Day raw.Year
[6] raw.Hour raw.Minute raw.Systolic raw.Diastolic raw.MAP
[11] raw.PP raw.HR raw.Event_Code raw.Edit_Status raw.Diary_Activity
[16] na.strings raw.facility raw.lastname raw.firstname raw.id
[21] raw.hookup raw.datetime raw.mrn unis ar.value
[26] ar.cat ID avg.hr.prhr avg.sys.prhr avg.dias.prhr
[31] avg.map.prhr avg.pp.prhr time time_60 raw.Minutee
<0 rows> (or 0-length row.names)
假设x$ar.cat[1] == "Arousals Index: LOW"
条件只在我的310个mrns[[i]]
数据帧中的180个中得到满足,我希望length(arlow)
的结果等于180。
谁有任何建议,如何删除那些数据帧不匹配的条件?
谢谢!
怎么样
arlow <- lapply( lapply(mrns, function(x) subset(x, x$ar.cat[1] == "Arousals Index: LOW")), function(y) nrow(y) >0)
首先你过滤你所做的,然后只取帧与数据
所以你想从arlow
中删除NULL
s ?
试题:
arlow <- arlow[[!is.null(arlow)]]
:
lst <- list(data.frame(x=1:10,y=rnorm(10)), NULL, data.frame(x=1:10,y=rnorm(10)))
length(lst)
# [1] 3
result <- lst[[!is.null(lst)]]
length(result)
# [1] 2
还有另一种方式:
result <- Filter(Negate(is.null), lst)
length(result)
# [1] 2
edit:实际上,我的回答没有多大意义。我没有在你想要的每个数据帧中做子集。但是,我仍然认为which()对于没有NA和NULL值的子集有用。
mrns[which(sapply(1:length(mrns), function(x) mrns[x]$ar.cat == "Arousals Index: LOW"))]
此解决方案测试类别(ar.cat)对于数据帧列表中的每个数据帧是否具有答案"唤醒索引:LOW"。结果向量应该有320个元素,其中满足条件的元素为真。现在我们使用which()来获得真实值的索引。这些索引应该忽略我们生成的向量中出现的任何NULL或NA值。作为最后一步,我们用我们想要的索引对数据帧列表进行子集。
感谢大家的回复!我发现添加了以下代码,并给了我我正在寻找的。
> arlow <- arlow[sapply(arlow, function(x) dim(x)[1]) > 0]
> length(arlow)
[1] 103