【问题标题】:NA when trying to summarize a subset of data (R)尝试汇总数据子集时不适用 (R)
【发布时间】:2015-12-03 00:08:58
【问题描述】:

整个向量没问题,没有NAs

> summary(data$marks)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    6.00    6.00    6.02    7.00    7.00

> length(data$marks)
[1] 2528

但是,当尝试使用标准计算子集时,我收到很多 NAs

> summary(data[data$student=="John",]$marks)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  1.000   6.000   6.000   6.169   7.000   7.000     464

> length(data[data$student=="John",]$marks)
[1] 523

【问题讨论】:

  • 请提供一个可重现的例子。此外,我推荐 data[data$student=="John", "marks"] 而不是 data[data$student=="John",]$marks,它更传统且更易于阅读
  • student 是否存在缺失值。如果student 的任何值缺失,即使student=="John" 没有缺失值并且marks 也没有缺失值,您也会得到NAs。如果你这样做summary(data[which(data$student=="John"), ]$marks)会发生什么?
  • 是的,student 实际上缺少值。但是,如果我使用精确匹配指定了某些,其背后的逻辑是什么?那么有什么解决办法呢?
  • NA 被== - x <- c(1,2,NA); x[x==1] 撤出

标签: r dataframe na missing-data


【解决方案1】:

我认为问题在于您缺少student 的值。结果,当您按student 进行子集化时,当您获取子集时,学生的所有NA 值最终都会为marks 生成NA。将子集条件包裹在which() 中以避免此问题。以下是一些有望阐明正在发生的事情的示例:

# Fake data
set.seed(103)
dat = data.frame(group=rep(LETTERS[1:3], each=3), 
                 value=rnorm(9))
dat$group[1] = NA

dat$value
dat[dat$group=="B", "value"]
dat[which(dat$group=="B"), "value"]

# Simpler example
x = c(10,20,30,40, NA)

x>20
x[x>20]

which(x>20)
x[which(x>20)]

【讨论】:

  • 你能添加一个解决方案吗?所以我需要将NAs 留在我的数据集中(因此子集在我的情况下不起作用),但要在没有它们的情况下计算摘要。
  • 将您的子集包装在which() 中,如我的示例所示。 which 返回匹配条件的行的索引,忽略 NA 值。
【解决方案2】:

首先请注意,NA=="foo" 的结果为 NA。当使用 NA 值对向量进行子集化时,结果为 NA。

t = c(1,2,3)
t[c(1,NA)]

【讨论】:

    【解决方案3】:

    tidyverse 解决方案。我发现这些比基本 R 更容易阅读。

    library(tidyverse)
    
    data %<%
      filter(student == "John") %<%
      summary(marks)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多