丢弃与条件R不匹配的数据帧

时间:2015-09-22 13:46:04

标签: r conditional-statements subset

我有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?

谢谢!

4 个答案:

答案 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