我有310个data.frames mrns[[i]]
的列表,我根据因子mrns[[i]]$ar.cat
的值进行子集化。我可以使用它们的子集,使那些不匹配条件的data.frames保留0个观察值,但我希望代码只删除这些data.frames而不是留下它们新列表为空。
我的代码是:
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]]
data.frames中的180个中得到满足,我希望length(arlow)
的结果等于180。 / p>
有人建议如何删除那些与条件不匹配的data.frame?
谢谢!
答案 0 :(得分:2)
那个怎么样
arlow <- lapply( lapply(mrns, function(x) subset(x, x$ar.cat[1] == "Arousals Index: LOW")), function(y) nrow(y) >0)
首先过滤您所做的事情,然后仅使用数据框架。
答案 1 :(得分:1)
所以你想从NULL
删除arlow
?
尝试:
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
此处another way:
result <- Filter(Negate(is.null), lst)
length(result)
# [1] 2
答案 2 :(得分:1)
编辑:实际上,我的答案没有多大意义。我没有在你想要的每个数据框中进行子集化。不过,我仍然认为which()对没有NA和NULL值的子集很有用。
mrns[which(sapply(1:length(mrns), function(x) mrns[x]$ar.cat == "Arousals Index: LOW"))]
此解决方案测试类别(ar.cat)是否有答案&#34;唤醒指数:LOW&#34;对于数据框列表中的每个数据框。生成的向量应该有320个元素,其中满足条件的元素为真。 现在我们使用which()来获取真值的索引。这些索引应该忽略我们生成的向量中出现的任何NULL或NA值。 作为最后一步,我们使用我们想要的索引对数据帧列表进行子集化。
答案 3 :(得分:0)
感谢大家的回复!我发现添加了以下代码并给了我正在寻找的内容。
> arlow <- arlow[sapply(arlow, function(x) dim(x)[1]) > 0]
> length(arlow)
[1] 103