我有一个表格(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的行;有人可以告诉我如何删除所有缺少观察值的行吗?
答案 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...))