【问题标题】:Exclude rows that contain NA in a particular column in subsets排除子集中特定列中包含 NA 的行
【发布时间】:2016-10-17 08:03:51
【问题描述】:

我正在尝试排除包含我选择的特定列的 NA 的子集的行。我有一个这种组织的调查数据的 CSV 电子表格,例如:

name    idnum   term    type      q2    q3
bob     0321    1       2         0     .
.       .       3       1         5     3
ron     .       2       4         2     1
.       2561    4       3         4     2

在创建 R 工作区时,我将其设置为 data <- read.csv(..., na.strings='.')。出于分析的目的,我随后按术语和类型创建了子集,例如 set13 <- subset(data, term=1 & type=2)。当我尝试进行 t 检验时,我注意到该函数抛出了任何 NA 实例,有效地将我的样本量减少了一半。

对于我的分析,我想排除缺少调查项目的回复,例如我的示例中的 Bob,缺少问题 3。但我仍然想在 name 或 @987654325 中包含具有一个或多个 NA 的行@ 列。所以,从本质上讲,我想按列选择哪些 NA 被省略。 (请记住,这只是一个示例 - 我的实际 CSV 大约有 1000 行,因此每个子集可能包含 100-150 行。)

我知道这可以使用数据框来完成,但我不确定如何将其合并到给定的子集格式中。有没有办法做到这一点?

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    查看complete.cases,如this SO 帖子的答案所示。

    data[complete.cases(data[,3:6]),]
    

    这将返回第 3 到第 6 列中包含完整信息的所有行。

    【讨论】:

    • data[complete.cases(data[,c(3,7,8)]),] 这将返回第 3、7、8 列的 complete.cases。这是你想要的吗?
    • 好的,谢谢。我认为这会解决它,但在我有更多时间处理代码/统计数据之前我无法确定。
    【解决方案2】:

    另一种方法。

    data[rowSums(is.na(data[,3:6]))==0,]
    

    【讨论】:

      【解决方案3】:

      另一种选择是

      data[!Reduce(`|`, lapply(data[3:6], is.na)),]
      

      【讨论】:

      • 您为什么提出这个特殊的解决方案?一般更快还是最佳实践? (了解您的典型反应,我认为出于某种原因会更好)
      • @Rilcon42 您的解决方案应该更快,因为它使用complete.cases。这只是另一种选择。
      猜你喜欢
      • 2021-12-15
      • 2020-08-12
      • 2012-06-30
      • 2021-03-06
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多