r - 如果列包含 NA,如何对 data.frame 进行子集化

标签 r dataframe

当基于字符列的条件对数据框进行子集化时,R(版本 3.3.3)给了我一些意想不到的行为。这是一个例子:

foo <- data.frame(bar = c('a',NA,'b','a'),
                  baz = 1:4,
                  stringsAsFactors = FALSE)

foo看起来像这样:

   bar baz
1    a   1
2 <NA>   2
3    b   3
4    a   4

我想获取此数据框的所有行,其中 bar != "a" ,所以我打电话:

foo[foo$bar != 'a', ]

这将返回:

    bar baz
NA <NA>  NA
3     b   3

我不明白为什么第二列中的第一个条目是 NA而不是2 。请帮我解释一下这种奇怪的行为。

最佳答案

当我试图理解这种行为时,在 R 中进行字符过滤的正确/更好的方法是使用 %in% 运算符。

foo <- data.frame(bar = c('a',NA,'b','a'),
                  baz = 1:4,
                  stringsAsFactors = FALSE)

foo[!(foo$bar %in% 'a'), ]

输出:

> foo[!(foo$bar %in% 'a'), ]
   bar baz
2 <NA>   2
3    b   3

更新:

该行为不是因为字符过滤器。这实际上是因为 NA 用于索引数据帧。

> foo[c(F,NA,T,F),]
    bar baz
NA <NA>  NA
3     b   3

传递 NA 作为索引值会用 NA 替换该位置的任何值

> foo[NA,]
      bar baz
NA   <NA>  NA
NA.1 <NA>  NA
NA.2 <NA>  NA
NA.3 <NA>  NA
> foo[c(T,NA),]
      bar baz
1       a   1
NA   <NA>  NA
3       b   3
NA.1 <NA>  NA

关于r - 如果列包含 NA,如何对 data.frame 进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48403916/

相关文章:

python - 如何阻止聚合函数向数据帧添加不需要的行?

r - 创建围绕日期的时间窗口

r - 使用预测模型和 TunePareto 包测试和训练数据集

R循环查找数据帧中的最小值和最大值

r - 如何创建在 R 的 for 循环中使用的 lmer 模型对象列表?

python - Pyspark 将列除以按另一列分组的小计

r - 如果一个数据框中的多个值重复多次,如何将它们替换为另一个数据框中的多个值

r - 如何制作根据条件跨列多次连接的 R 循环

R:没有for循环的子集和排序大数据帧

pandas 0.14.1 中 sqlalchemy 的 python pandas parse_dates 列通配符?