【问题标题】:Subsetting Rows in R producing NAs, but there are no NAs in Data FrameR中产生NA的子集行,但数据框中没有NA
【发布时间】:2021-03-24 14:56:03
【问题描述】:

我查看了其他问题,这些问题似乎存在类似问题,随机行被所有 NA 值替换,但没有找到解决方案,因为其他用户的数据帧中已经存在 NA(如 Subsetting R data frame results in mysterious NA rows) .

我首先使用 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 替换了一堆行(尽管在此示例中未表示)?真实数据属于机密,不能共享,抱歉!

【问题讨论】:

  • x[unique(x[x$component==1,]$ObjectID),]$distance 这段代码给了我 NAs...不是你得到的。

标签: r subset na


【解决方案1】:

很难评论如何从数据中删除 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() 

【讨论】:

    【解决方案2】:

    我们可以用逻辑表达式指定行,将列名作为字符串的列子集,获取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
    

    或者更简洁,用&amp;连接两个条件

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

    OP 代码中的问题是使用 'ObjectID' 的 unique 值作为行索引,由于索引可以是逻辑索引或数字索引而失败

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

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

    【讨论】:

    • 感谢您的快速回复!两种代码选项似乎都有效。对于为什么'ObjectID'不能用作索引,我仍然有点困惑?
    • @Anne-Marie 如果 data.frame 有 row.names 作为 ObjectID,则可以使用它。但是,在这里,情况并非如此,data.frame 也不能有重复的 row.names。行索引是数字或逻辑
    猜你喜欢
    • 2012-12-25
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    相关资源
    最近更新 更多