我想在不同的列中使用相同的条件选择行。
set.seed(123)
df <- data.frame(col.x = sample(LETTERS[1:10], 20, replace = TRUE),
col.y = sample(LETTERS[1:10], 20, replace = TRUE),
val = rnorm(20))
我需要ValsToRetain
中的两列col.x
,col.y
中只有{。}}。
ValsToRetain <- c('A','D', 'F','H','J')
我尝试过这两种给出相同预期输出的方法。
df %>% filter(col.x %in% ValsToRetain) %>% filter(col.y %in% ValsToRetain)
df %>% filter(col.x %in% ValsToRetain & col.y %in% ValsToRetain)
# col.x col.y val
# 1 A H -1.6866933
# 2 F F 0.8377870
# 3 J J 0.4264642
# 4 F H 0.8781335
# 5 D D -0.3059627
但是,有没有其他优雅的方法可以做到这一点?
例如;比如在这些列中计算rowSums
以检查它是否有na
个。由于有多个值,我无法得到像rowSums(df[,1:2] == 'A')
这样的类似想法。
答案 0 :(得分:3)
我们可以将filter_at
与all_vars
df %>%
filter_at(vars(starts_with("col")), all_vars(. %in% ValsToRetain))
# col.x col.y val
#1 A H -1.6866933
#2 F F 0.8377870
#3 J J 0.4264642
#4 F H 0.8781335
#5 D D -0.3059627
答案 1 :(得分:1)
以下是使用Reduce
和lapply
的基本R方法。 lapply
在相关列中应用%in%
,返回逻辑向量列表。然后Reduce
使用&
将这些向量组合到一个向量中。
df[Reduce("&", lapply(df[c("col.x", "col.y")], "%in%", ValsToRetain)),]
col.x col.y val
6 A H -1.6866933
7 F F 0.8377870
11 J J 0.4264642
14 F H 0.8781335
19 D D -0.3059627
如果您有多列要进行比较,那么您可以使用grep
选择grep("^col", names(df))
代替c("col.x", "col.y")
。
答案 2 :(得分:-1)
你可以使用子集,它很短但与你的方法相同:
filt <- subset(df,col.x %in% ValsToRetain & col.y %in% ValsToRetain)
输出结果为:
col.x col.y val
A H -1.6866933
F F 0.8377870
J J 0.4264642
F H 0.8781335
D D -0.3059627