【问题标题】:Remove multiple rows based on missing values in fewer rows - Cannot allocate vector of size根据较少行中的缺失值删除多行 - 无法分配大小向量
【发布时间】:2015-06-23 21:43:02
【问题描述】:

我有一个 R 数据框,其中包含来自多个主题的数据,每个主题都测试了几次。为了对集合进行统计,有一个主题(“id”)因子和每个观察值(大约 40,000 个)的一行,每个观察值大约有 200 个变量。

allData <- data.frame(id       = rep(1:4, 3),
                      session  = rep(1:3, each = 4),
                      measure1 = sample(c(NA, 1:11)),
                      measure2 = sample(c(NA, 1:11)),
                      measure3 = sample(c(NA, 1:11)),
                      measure4 = sample(c(NA, 1:11)))
allData                      
#    id session measure1 measure2 measure3 measure4
# 1   1       1        3        7       10        6
# 2   2       1        4        4        9        9
# 3   3       1        6        6        7       10
# 4   4       1        1        5        2        3
# 5   1       2       NA       NA        5       11
# 6   2       2        7       10        6        5
# 7   3       2        9        8        4        2
# 8   4       2        2        9        1        7
# 9   1       3        5        1        3        8
# 10  2       3        8        3        8        1
# 11  3       3       11       11       11        4
# 12  4       3       10        2       NA       NA

鉴于“measureX”(X=1,..,4) 列在 id 1 和 4 的行之一中包含 NA,我需要删除所有 id 为 1 和 4 的行。

flodel 在 [https://stackoverflow.com/a/9917524/5042101][1] 中建议使用“plyr”包和函数 ddply 解决此问题。

probeColumns = c('measure1','measure4')

library(plyr)
ddply(allData, "id",
      function(df)if(any(is.na(df[, probeColumns]))) NULL else df)

问题。我的数据库包括大约 40,000 行和 200 列。尝试单列时出现错误:C stack usage 10027284。

我在 Windows 上的 RStudio 中使用 R 3.1.3。当尝试更多列时,RStudio 会自动关闭或 R 冻结。此外,我无权访问计算机中的管理员会话。

【问题讨论】:

  • id==(1,4) 是什么意思?这不是 R 语法,所以口头描述会很有用
  • @rsoren - id %in% c(1,4) 我认为他们的意思是。

标签: r


【解决方案1】:

我不能确切地说出plyr 的问题是什么(尽管它可能是包中的一个错误)。可以使用apply

> allData[apply(allData, 1, function(x) !any(is.na(x[probeColumns]))), ]
   id session measure1 measure2 measure3 measure4
1   1       1        1        1        2        4
2   2       1        5        4        6        1
3   3       1        9        8       NA        3
4   4       1       11        7        7        5
5   1       2        8        5       11        2
6   2       2        6       NA        5        8
7   3       2       10       10        3       10
9   1       3        4        9        4        9
10  2       3        2        6        8        7
11  3       3        3        3        9        6

一点解释 - apply(allData, c(1), function(x) !any(is.na(x[probeColumns]))) 通过逐行检查probeColums 中的一行中是否有任何值来确定probeColumns 指定的列中没有NA 的行的索引是NA

【讨论】:

    【解决方案2】:

    这可能是我的解决方案有点笨拙,但这是我的想法:

    1. 找出NAs 的位置
    2. 然后确定它们对应的id
    3. 最后一步删除所有 id 至少具有 (至少在一列中)NA

      ind <- allData[apply(allData, 1, function(x) sum(is.na(x))) == !0, 1 ]
      
      allData %>% filter(!id %in% ind)
        id session measure1 measure2 measure3 measure4
      1  1       1        1        6        1        8
      2  2       1       10        2        7        2
      3  1       2       11        7        5       11
      4  2       2        5        5        4        7
      5  1       3        4        8        9        5
      6  2       3        8       11        3        9
      

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 2021-08-13
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多