子集R数据帧导致神秘的NA行

chr*_*isg 49 r subset reshape na

我一直在遇到我认为的错误.这不是什么大问题,但我很好奇是否有其他人看过这个.不幸的是,我的数据是保密的,所以我必须要弥补的例子,它不会是非常有益的.

当子集化我的数据,我偶尔得到不在我的原始数据帧神秘NA行.甚至rownames都是NA.例如:

example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z"))
example

  var1 var2
1    A    X
2    B    Y
3    A    Z
Run Code Online (Sandbox Code Playgroud)

然后我跑:

example[example$var1=="A",]

  var1 var2
1    A    X
3    A    Z
NA<NA> <NA>
Run Code Online (Sandbox Code Playgroud)

当然,上面的例子实际上并没有给你这个神秘的NA行; 我在这里添加它来说明我对数据的问题.

也许这与我使用Google的read.xlsx包导入我的原始数据集然后在子集化之前执行从长到长的重塑这一事实有关.

谢谢

c-u*_*hin 43

包裹条件which:

df[which(df$number1 < df$number2), ]
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

它返回条件匹配的行号(条件所在的位置TRUE),并相应地对这些行上的数据帧进行子集化.

比如说:

which(df$number1 < df$number2)
Run Code Online (Sandbox Code Playgroud)

返回的行数1,2,3,45.

因此,写作:

df[which(df$number1 < df$number2), ]
Run Code Online (Sandbox Code Playgroud)

与写作相同:

df[c(1, 2, 3, 4, 5), ]
Run Code Online (Sandbox Code Playgroud)

或者更简单的版本是:

df[1:5, ]
Run Code Online (Sandbox Code Playgroud)


Wal*_*cio 24

我看到OP已经回答了这个问题,但是由于他的评论深深埋藏在评论部分中,这是我尝试解决这个问题(至少我的数据,行为方式相同).

首先,一些样本数据:

> df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA))
> df
   name number1 number2
1     A       1      10
2     B       2       9
3     C       3       8
4     D       4       7
5     E       5       6
6     F       6       5
7     G       7       4
8     H       8       3
9     I       9      NA
10    J      10      NA
Run Code Online (Sandbox Code Playgroud)

现在换一个简单的过滤器:

> df[df$number1 < df$number2, ]
     name number1 number2
1       A       1      10
2       B       2       9
3       C       3       8
4       D       4       7
5       E       5       6
NA   <NA>      NA      NA
NA.1 <NA>      NA      NA
Run Code Online (Sandbox Code Playgroud)

这里的问题是NA第三列中s 的存在导致R将整行重写为NA.尽管如此,仍保持数据框尺寸.这是我的修复,需要知道哪个列包含NAs:

> df[df$number1 < df$number2 & !is.na(df$number2), ]
  name number1 number2
1    A       1      10
2    B       2       9
3    C       3       8
4    D       4       7
5    E       5       6
Run Code Online (Sandbox Code Playgroud)

  • 上面回答,which()函数可能适合该角色,但效果不理想。我坚信这是一个错误,并且很不幸,这种“功能”(NA选择疯狂)不会得到解决。 (2认同)

小智 11

使用类似于您发布的代码时,我遇到了同样的问题.使用函数子集()

subset(example,example$var1=="A")
Run Code Online (Sandbox Code Playgroud)

相反,NA行被排除在外.

  • 这很有帮助,但请注意在交互式R会话之外的任何地方使用`subset`的潜在问题.从函数的帮助页面:"这是一个便于交互使用的便利函数.对于编程,最好使用像[,特别是参数子集的非标准评估可能会产生意想不到的后果的标准子集函数." (5认同)

Vic*_*Yan 6

使用 dplyr:

library(dplyr)
filter(df, number1 < number2)
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现使用 %in$ 而不是 == 可以解决这个问题,尽管我仍然想知道为什么。例如,不要使用: df[df$num == 1,],而是使用: df[df$num %in% c(1),] 即可。