【问题标题】:Delete only an entire row with NA, in R在 R 中仅删除带有 NA 的整行
【发布时间】:2017-06-12 04:31:52
【问题描述】:

我的数据集中有这样的东西,我只想删除只有 NA 的行,而不是至少有一个值。

      [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]   NA   NA   NA
[5,]    4    8   NA

在这个example 中,他们能够删除我想要的内容,但是当我尝试以完全相同的方式进行操作时,它不起作用。

我已经尝试过他们的例子:

数据[rowSums(is.na(data)) != ncol(data),]

但是我的行号不会像这个一样变化。

       [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]    4    8   NA

我的 NA 不是字符。如果我问他们的课:

class(NA)
[1] "logical"

请问您知道另一种索取方式吗?

______更新_____

也许我说错了。

我的问题,这就是代码不起作用的原因

mymat[rowSums(is.na(mymat)) != ncol(mymat), ]

因为我有 3 列的信息,但在那之后,一切都是 NA,像这样:

Date         Product    Code   protein   fat
2016-01-01     aaa      0001      NA     NA
2016-01-01     bbb      0003      NA     NA
2016-02-01     ccc      0032      NA     NA

所以该行不是完全 NA,仅在第 3 列之后...但我想删除整行.. (1:5)

谢谢!

【问题讨论】:

  • 那里没有行号。请检查暗名

标签: r rows delete-row na


【解决方案1】:

你需要删除 as.integer

mymat <- matrix(c(1:3, NA, 4:6, NA, rep(NA, 4)), ncol = 3)

翻译成

     [,1] [,2] [,3]
[1,]    1    4   NA
[2,]    2    5   NA
[3,]    3    6   NA
[4,]   NA   NA   NA


mymat[as.integer(rowSums(is.na(mymat)) != ncol(mymat)), ]

给你

     [,1] [,2] [,3]
[1,]    1    4   NA
[2,]    1    4   NA
[3,]    1    4   NA

但你想要

mymat[rowSums(is.na(mymat)) != ncol(mymat), ]

得到

     [,1] [,2] [,3]
[1,]    1    4   NA
[2,]    2    5   NA
[3,]    3    6   NA

干杯, 马克

【讨论】:

  • 感谢您的帮助,但是我认为我没有很好地解释我.. 现在我更新了我的问题,您能帮帮我吗?
  • 你想删除列而不是行,你说得对吗?
  • 我用其他方法做了,但还是谢谢你! :)
【解决方案2】:

检查这是否适用于更新后的说明。在检查NA 时,它将子集data.frame 以忽略信息列。我添加了一些额外的行,其中包含混合数字和NA

df1 <- data.frame(Date=c("2016-01-01", "2016-01-01", "2016-02-01", "2016-03-01", "2016-03-01"),
              Product=c("aaa", "bbb", "ccc", "ddd", "eee"),
              Code=c("0001", "0003", "0032", "0005", "0007"),
              protein=c(NA, NA, NA, 5, NA),
              fat=c(NA, NA, NA, NA, 4))

# place any columns you do not want to check for NA in names.info
names.info <- c("Date", "Product", "Code")
names.check <- setdiff(names(df1), names.info)

df1[rowSums(is.na(df1[, names.check])) != length(names.check), ]

        Date Product Code protein fat
4 2016-03-01     ddd 0005       5  NA
5 2016-03-01     eee 0007      NA   4

【讨论】:

  • 感谢您的帮助,但我认为我没有很好地解释我..现在我更新了我的问题,您能帮帮我吗?
  • @AnaRaquel 查看更新后的答案,因为这将忽略信息列,并且无论使用多少数据列都可以工作
【解决方案3】:

首先,我会将矩阵强制转换为数据框,因为这是存储变量和观察值的典型(“整洁”)格式。然后你可以使用sjmisc-package中的remove_empty_rows()函数:

库(sjmisc)

df <- data.frame(
  a = c(1, 1, 4, NA, 4),
  b = c(2, NA, 6, NA, 8),
  c = c(3, 4, 7, NA, NA)
)

# get row numbers of empty rows
empty_rows(df)

## [1] 4

# remove empty rows
remove_empty_rows(df)

##  A tibble: 4 × 3
##        a     b     c
##  * <dbl> <dbl> <dbl>
##  1     1     2     3
##  2     1    NA     4
##  3     4     6     7
##  4     4     8    NA

还有用于列的函数:empty_cols()remove_empty_cols()

如果您只想保留完整的案例(行),请使用complete.cases()

df[complete.cases(df), ]

##   a b c
## 1 1 2 3
## 3 4 6 7

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2019-12-28
    • 2018-12-15
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多