df的尾巴:
fruit Letter Points A B C D
16 cherry P 7876 11.43 7.23 13.72 4.29.01
17 chili pepper Q 7831 10.85 7.18 14.14 4.33.90
18 clementine R 7827 11.07 7.24 14.19 4.56.52
19 cloudberry S 7704 10.38 7.73 14.32 X
20 coconut T 7634 11.21 7.12 13.25 4.57.92
21 cranberry U 7346 10.88 6.65 13.80 4.32.50
这似乎是一个常见问题,但是我看到的所有答案都基于过滤一列或所有列。在这里,我要删除仅 列A至D中包含“ X”的行。
根据先前的答案,如果我只想过滤一列,则可以执行以下操作:
df <- df[!grepl("X", df$D),]
这可以正常工作,但我只能手动完成此操作,因为我知道先验所在的“ X”。由于我想对许多相同格式的df进行过滤,因此我需要一种对列A到D进行过滤的方法。
凭直觉,我认为我可以在grepl中扩展参数,以包括要过滤的列:
df <- df[!grepl("X", df[,c("A","B","C","D")]),]
或
df1 <- df1[!grepl("X", df1[,4:7]),]
但是,这最终会删除不包含“ X”的行,更不用说A-D列中的字母了。我猜这是因为grep系列函数不接受多个向量吗?
理想情况下,我想要一个基本的解决方案,因为我迷上了一些应该易于理解的问题。
完整df:
df <- structure(list(fruit = c("apple", "apricot", "avocado", "bell pepper",
"bilberry", "blackberry", "blood orange", "blueberry", "boysenberry",
"canary melon", "cantaloupe", "cherimoya", "chili pepper", "clementine",
"cloudberry", "cranberry"), Letter = c("A", "B", "C", "E", "F",
"G", "I", "J", "K", "M", "N", "O", "Q", "R", "S", "U"), Points = c(8900,
8757, 8742, 8554, 8531, 8461, 8206, 8153, 8113, 8106, 8050, 8017,
7831, 7827, 7704, 7346), A = c("10.54", "10.64", "10.69", "10.64",
"10.76", "10.99", "10.81", "11.00", "10.84", "11.05", "10.72",
"10.84", "10.85", "11.07", "10.38", "10.88"), B = c("8.03", "7.88",
"7.78", "7.24", "7.92", "7.59", "7.68", "7.32", "7.37", "7.34",
"7.18", "6.89", "7.18", "7.24", "7.73", "6.65"), C = c("16.68",
"15.19", "14.14", "15.72", "14.50", "14.75", "15.64", "14.19",
"15.09", "15.10", "14.66", "14.20", "14.14", "14.19", "14.32",
"13.80"), D = c("4.42.33", "4.35.06", "4.35.59", "4.23.13", "4.23.23",
"4.29.93", "4.48.64", "4.21.06", "4.30.12", "4.52.35", "5.00.38",
"4.48.11", "4.33.90", "4.56.52", "X", "4.32.50")), row.names = c(1L,
2L, 3L, 5L, 6L, 7L, 9L, 10L, 11L, 13L, 14L, 15L, 17L, 18L, 19L,
21L), class = "data.frame")
答案 0 :(得分:0)
我们可以遍历感兴趣的列,检查值是否等于"X"
(基于数据,这是一个精确匹配),然后Reduce
的{{1}}逻辑list
到vector
的单个vector
中,并使用它来对数据进行子集
|
或使用df[!Reduce(`|`, lapply(df[c("A", "B", "C", "D")], `==`, "X")),]
(如果不完全相同)
grepl
或使用df[!Reduce(`|`, lapply(df[c("A", "B", "C", "D")], grepl, pattern = "X")),]
tidyverse
答案 1 :(得分:0)
取决于您的数据结构:
df[!grepl('X',do.call(paste,df[4:7])),]
应该工作。
例如,如果您根本有其他值,例如23X.4
并且想要维护它们,则可以使用正则表达式,如下所示:
df[!grepl('(?m)^X$',do.call(paste,c(sep='\n',df[4:7])),perl = T),]
答案 2 :(得分:0)
cols = c("A", "B", "C", "D")
df[! rowSums(df[cols] == "X"), ]
这将从df
中删除行,其中cols
中的任何值是 "X"
(而不是包含"X"
,就像其他答案一样)。
答案 3 :(得分:0)
使用dplyr删除其中任何A,B,C或D列中的值等于'X'的行,如下所示:
library(dplyr)
filter_at(df, vars(A:D), any_vars(!. == 'X'))