在R中跨数据帧搜索列表?

在R中跨数据帧搜索列表?,r,dataframe,R,Dataframe,目前,我有一个内置于R中的数据库,如下所示: df <- data.frame(c('ABC','DEF','HIJ'), c(1,2,5), c(2,5,9), c(14,19,12)) 此函数在执行时返回以下内容: HIJ 5 9 12 DEF 2 5 19 我希望能够输入一个值列表作为向量,然后使用循环一次过滤所有值,以返回匹配的值,但是,我完全无法使用上面的搜索函数创建一个

目前,我有一个内置于R中的数据库,如下所示:

df <- data.frame(c('ABC','DEF','HIJ'),
                 c(1,2,5),
                 c(2,5,9),
                 c(14,19,12))
此函数在执行时返回以下内容:

 HIJ 5 9 12
 DEF 2 5 19
我希望能够输入一个值列表作为向量,然后使用循环一次过滤所有值,以返回匹配的值,但是,我完全无法使用上面的搜索函数创建一个循环函数来从我的数据集中的向量中查找值。下面是我试图实现的一个示例,通过在数据框df中搜索向量v中的值,返回df的所有行,其中任何列或行中的值与v中的值相同:

v <- c(1,2,13,19,16,120,2934,1087)
我想知道执行循环以执行此搜索的最佳方式是什么?

我们可以使用:

df[rowSums(sapply(df, `%in%`, v)) > 0, ]
或使用dplyr

library(dplyr)
df %>% filter_all(any_vars(. %in% v))

首先重塑数据可能更容易。我将使用
data.table::melt

library(data.table)
df = data.frame(
  V1 = c("ABC", "DEF", "HIJ"), 
  V2 = c(1, 2, 5), 
  V3 = c(2, 5, 9), 
  V4 = c(14, 19, 12)
)
setDT(df)

# reshape long
melt_df = melt(df, id.vars = 'V1')
melt_df
#        V1 variable value
# 1:    ABC       V2     1
# 2:    DEF       V2     2
# 3:    HIJ       V2     5
# 4:    ABC       V3     2
# 5:    DEF       V3     5
# 6:    HIJ       V3     9
# 7:    ABC       V4    14
# 8:    DEF       V4    19
# 9:    HIJ       V4    12
现在我们可以一次查找所有内容:

melt_df[value %in% v]
#        V1 variable value
# 1:    ABC       V2     1
# 2:    DEF       V2     2
# 3:    ABC       V3     2
# 4:    DEF       V4    19
这就是要点。要恢复您最初想要的输出,我们需要执行一些其他步骤:

df[.(V1 = melt_df[value %in% v, unique(V1)]), on = 'V1']
#        V1    V2    V3    V4
# 1:    ABC     1     2    14
# 2:    DEF     2     5    19

这将从
melt_df
unique
删除重复项)中提取
V1
的关联值,并将它们连接回
df
(因此
)以从
df

中获取关联行
ABC
为什么不返回?1和2都在
v
中,如果您觉得这对您有帮助,请单击左侧投票按钮旁边的复选标记以自由选择。:-)每个帖子只能接受一个答案。
melt_df[value %in% v]
#        V1 variable value
# 1:    ABC       V2     1
# 2:    DEF       V2     2
# 3:    ABC       V3     2
# 4:    DEF       V4    19
df[.(V1 = melt_df[value %in% v, unique(V1)]), on = 'V1']
#        V1    V2    V3    V4
# 1:    ABC     1     2    14
# 2:    DEF     2     5    19