使用R:当行包含某些值时,如何删除行?

时间:2019-05-05 16:14:28

标签: r

我有一个表格(737:35),该表格对于缺失的观测值具有不同的值,例如不适用,0,不适用或-

因此,该表如下所示:

┌────┬────┬──────┬──────┬──────┬──────┬──────┐
│ X  │ Y  │ 2010 │ 2011 │ 2012 │ 2013 │ 2014 │
├────┼────┼──────┼──────┼──────┼──────┼──────┤
│ A  │ XY │ 0    │ 0    │ 0    │ 10   │ 15   │
│ A  │ XZ │ 11   │ 13   │ n/a  │ 12   │ 14   │
│ B  │ XY │ 0    │ --   │ 0    │ 7    │ --   │
│ B  │ XZ │ 15   │ 16   │ 12   │ 13   │ 14   │
│ C  │ XY │ NA   │ NA   │ NA   │ NA   │ NA   │
│ C  │ XZ │ 8    │ 12   │ 11   │ n/a  │n/a   │
└────┴────┴──────┴──────┴──────┴──────┴──────┘

我想删除所有值为NA,0,n / a或-的行,因此在此示例中最终只有5行

我可以使用is.na()删除带有NA的行,并使用grep()删除2010列中带有0的行;有人可以告诉我如何删除所有缺少观察值的行吗?

2 个答案:

答案 0 :(得分:5)

一种选择是使用%in%is.na一起使用|检查列中是否存在值'0','n / a'或'-') }},Reduce到带有vector的单个逻辑|中,以检查行中是否有任何字符具有这些字符,取反(!-表示该元素中没有任何元素该行具有该字符)并使用该o的行子集

i1 <- !Reduce(`|`, lapply(df1, function(x) is.na(x)| x %in% c(0, "n/a", "--")))
df2 <- df1[i1, , drop = FALSE]
#   X  Y 2010 2011 2012 2013 2014
#4 B XZ   15   16   12   13   14

或使用filter_all

library(dplyr)
df1 %>%
     filter_all(all_vars(!(is.na(.) | . %in% c(0, "n/a", "--"))))
#   X  Y 2010 2011 2012 2013 2014
#1 B XZ   15   16   12   13   14

数据

df1 <- structure(list(X = c("A", "A", "B", "B", "C", "C"), Y = c("XY", 
"XZ", "XY", "XZ", "XY", "XZ"), `2010` = c(0L, 11L, 0L, 15L, NA, 
8L), `2011` = c("0", "13", "--", "16", NA, "12"), `2012` = c("0", 
"n/a", "0", "12", NA, "11"), `2013` = c("10", "12", "7", "13", 
NA, "n/a"), `2014` = c("15", "14", "--", "14", NA, "n/a")),
class = "data.frame", row.names = c(NA, 
-6L))

答案 1 :(得分:3)

使用apply逐行检查该行的任何元素是否在字符向量na.strings中。这给出了每行一个元素的逻辑矢量,其中TRUE表示对应的行具有在na.strings中找到的元素。否定该逻辑矢量和下标df1

na.strings <- c(0, NA, "NA", "--", "n/a")
df1[ !apply(df1, 1, function(x) any(x %in% na.strings)), ]

这不能区分0和“ 0”或NA和“ NA”,但是我怀疑您希望所有这些字符都被视为丢失。如果您确实想区分NA和“ NA”,并且只将NA而不是“ NA”视为缺失,则从na.strings中省略“ NA”。

请注意,如果您正在从文本文件中读取内容,则可以在na.strings命令中指定read.table

na.omit(read.table("myfile", na.strings = c("NA", "0", "n/a", "--"), ...whatever...))