我研究过其他问题,这些问题似乎也存在类似的问题,随机行被所有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()