【问题标题】:drop dataframes that don't match condition R丢弃不符合条件 R 的数据帧
【发布时间】:2015-12-19 12:48:54
【问题描述】:

我有一个包含 310 个数据帧的列表,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。

有人对如何删除那些不符合条件的data.frames有任何建议吗?

谢谢!

【问题讨论】:

  • 如果你使用的是 R 3.2.0+,你可以试试arlow[lengths(arlow) &gt; 0]

标签: r conditional-statements subset


【解决方案1】:

怎么样

arlow <- lapply( lapply(mrns, function(x) subset(x, x$ar.cat[1] == "Arousals Index: LOW")), function(y) nrow(y) >0)

首先你过滤你所做的,然后只用数据拍摄帧。

【讨论】:

  • 啊,好电话@Szymon!当我运行它时,我得到一个真假值列表作为我的箭头列表。 &gt; arlow[[1]] = [1] FALSE 差不多了,我只需要弄清楚如何摆脱那些返回错误的数据框。
【解决方案2】:

所以您想从arlow 中删除NULLs?

试试:

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

【讨论】:

  • 谢谢@jlhoward!由于某种原因,这给了我 35 的长度,而且我知道我有超过 35 个空数据帧。我最终使用了上面的dim,它给了我想要的东西。感谢您的建议。
  • 长度是非空data.frames的数量。
【解决方案3】:

edit:实际上,我的回答没有多大意义。我没有在您想要的每个数据框中进行子集化。不过,我仍然认为 which() 对于没有 NA 和 NULL 值的子集很有用。

mrns[which(sapply(1:length(mrns), function(x) mrns[x]$ar.cat == "Arousals Index: LOW"))]

此解决方案测试类别 (ar.cat) 是否为您的数据框列表中的每个数据框提供“唤醒指数:低”的答案。结果向量应该有 320 个元素,其中满足条件的元素为真。 现在我们使用 which() 来获取真实值的索引。这些索引应该忽略我们生成的向量中出现的任何 NULL 或 NA 值。 作为最后一步,我们使用我们想要的索引对数据帧列表进行子集化。

【讨论】:

  • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
  • 谢谢@CarlAH。我运行了代码并得到了Error in which(sapply(1:length(mrns), function(x) mrns[x]$ar.cat == "Arousals Index: LOW")) : argument to 'which' is not logical。我找到了我需要的东西,但很高兴看到不同的做事方式。
【解决方案4】:

感谢大家的回复!我发现添加了以下代码并给了我我想要的东西。

> arlow <- arlow[sapply(arlow, function(x) dim(x)[1]) > 0]
> length(arlow)
[1] 103

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2023-03-11
    • 2012-07-05
    • 2017-12-30
    • 2015-03-16
    相关资源
    最近更新 更多