删除与条件 R 不匹配的数据帧



我有一个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

最新更新