在R中子集行生成NA,但在数据帧中没有NA

  • 本文关键字:NA 数据帧 子集 r subset na
  • 更新时间 :
  • 英文 :


我研究过其他问题,这些问题似乎也存在类似的问题,随机行被所有NA值替换,但没有找到解决方案,因为其他用户的数据帧中已经存在NA(如子集R数据帧导致神秘的NA行(。

我使用na.omit首先删除任何可能的na,但在最后一步,仍在生成na行。

我使用三列对数据进行子集设置——一列是数字和字母的混合ID列(11xx1234(,一列是二进制分类列(0或1(,还有一列是以米为单位的距离值列。任何出现多次的ID都会在二进制类别列中指定一个1。我试图在二进制类别列中提取为1的数据,但不希望ID被表示多次,这样与每个ID相关的距离就不会被计算多次,从而扭曲任何统计测试。

所以类似于:

x<-data.frame(ObjectID = c("11AD1234", "11AD1234", "11AB123", "11BA34", "11DA354", "11DA354"), 
component = c(1,1,0,0,1,1), 
distance = c(2,2,5,8,4,4))

哪个给出:

ObjectID component distance
1 11AD1234         1        2
2 11AD1234         1        2
3  11AB123         0        5
4   11BA34         0        8
5  11DA354         1        4
6  11DA354         1        4

这是我尝试使用的代码,在添加距离列之前,它非常有效。

x[unique(x[x$component==1,]$ObjectID),]$distance
[1] 2 8

正确的答案应该是2和4,那么我在做什么呢?还以某种方式用NA替换了一堆行(尽管本例中没有表示(?真实数据是保密的,不能共享,对不起!

我们可以用逻辑表达式指定行,用字符串的列名子集列,得到unique并提取distance

unique(x[x$component ==1, c("ObjectID", "distance")])$distance
#[1] 2 4

如果目的只是基于"ObjectID"的"唯一"值来获得"距离",我们可以使用duplicated

with(subset(x, component == 1, select = c(ObjectID, distance)), 
distance[!duplicated(ObjectID)])
#[1] 2 4

或者更紧凑地,用&连接两个条件

subset(x, !duplicated(ObjectID) & component == 1)$distance
#[1] 2 4

OP代码中的问题是使用"ObjectID"的unique值作为行索引,这会失败,因为索引可以是逻辑索引或数字索引

unique(x[x$component==1,]$ObjectID)
#[1] "11AD1234" "11DA354" 

如果我们必须将其转换为逻辑,我们可以使用%in%

很难评论如何从数据中删除NA。你可以利用的几个选择。

根据您的数据,考虑这个

x<-data.frame(ObjectID = c("11AD1234", "11AD1234", "11AB123", "11BA34", "11DA354", "11DA354","11DA354", "11DA354"), 
component = c(1,1,0,0,1,1, NA, NA), 
distance = c(2,2,5,8,NA,NA,4,4))
x <- x[!is.na(x)]

另一种选择是使用库来为您做这件事。

library(tidyverse)
x %>% na.omit() 

最新更新