在R中,我有一个这样的数据框。
df
Tour Order Machine Company
[1] A D D B
[2] B B A G
[3] A E B A
[4] C B C B
[5] A G G C
我想获取三列Tour
,Order
Machine
包含至少一个D
E
或G
的行。
结果应为:
Tour Order Machine Company
[1] A D D B
[3] A E B A
[5] A G G C
我的尝试
df %>%
filter(any(c(Tour, Order, Machine) %in% c('D', 'E', 'G')))
但是它不能正确过滤(返回所有行)。有人可以帮我吗?
答案 0 :(得分:5)
使用tidyverse
的另一种filter_at
方法
df %>% filter_at(vars(-Company), any_vars(. %in% c("D", "E", "G")))
# Tour Order Machine Company
#1 A D D B
#2 A E B A
#3 A G G C
答案 1 :(得分:3)
另一个选择:
df[rowSums(sapply(df[-4], '%in%', c('D', 'E', 'G'))) > 0,]
结果:
Tour Order Machine Company
1 A D D B
3 A E B A
5 A G G C
使用dplyr
,您应该添加rowwise()
:
df %>%
rowwise() %>%
filter(any(c(Tour, Order, Machine) %in% c('D', 'E', 'G')))
答案 2 :(得分:1)
ind <- apply(sapply(df1[c("Tour","Order","Machine")],`%in%`,c('D', 'E', 'G')),1,any)
df1[ind,]
# Tour Order Machine Company
# 1 A D D B
# 3 A E B A
# 5 A G G C
sapply
将返回一个布尔矩阵,其中包含每个单元格的匹配项。apply
将检查其中是否有TRUE
,这意味着您要保留该行dplyr版本:
df1 %>%
filter_at(c("Tour","Order","Machine"),any_vars(.%in% c('D', 'E', 'G')))
# Tour Order Machine Company
# 1 A D D B
# 2 A E B A
# 3 A G G C
数据
df1 <- read.table(header=TRUE,stringsAsFactors=FALSE,text="
Tour Order Machine Company
A D D B
B B A G
A E B A
C B C B
A G G C")
答案 3 :(得分:1)
您可以在列上lapply
进行匹配检查,然后使用Reduce
(或)|
选择是否存在匹配项。
df[Reduce('|', lapply(df[-4], '%in%', c('D', 'E', 'G'))),]
答案 4 :(得分:0)
使用基数R:
df1[grepl("[DEG]",do.call(paste,df1[-4])),]# YOU CAN USE "D|E|G"
Tour Order Machine Company
1 A D D B
3 A E B A
5 A G G C