在R中跨数据帧搜索列表?
目前,我有一个内置于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 我希望能够输入一个值列表作为向量,然后使用循环一次过滤所有值,以返回匹配的值,但是,我完全无法使用上面的搜索函数创建一个
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