首页 > 解决方案 > R:按列名过滤数据框,并在不同的数据框列中使用字符串匹配

问题描述

我有两个数据框,如下所示。我想做的是对第一个数据框进行子集化,以仅保留其列名出现在第二个数据框的列中的列,以及与一个特定字符串匹配的部分字符串的列。实际数据更长,名称更多样化,所以我需要一些可以轻松应用于所有这些的东西。

df1:

abc1 abc2 acd1 abd1 acd2 xxx1 xxx2
1 2 3 4 5 6 7

df2:

样本 全部的
abc1 5
abc2 4

所需的df3:

abc1 abc2 xxx1 xxx2
1 2 6 7

这是我尝试过的

keep <- df2$sample
df3 <- df1 %>% select(contains(keep))

它保留了所有具有部分字符串匹配的列,而不是完整的字符串匹配

keep <- df2$sample
df3 <- filter(df1, grepl(keep,colnames(df1)))

这给了我一个错误,输入 1 的大小必须为 1037 或 1,而不是 160(1037= df1 中的 #of 行,160= #of 列)

此外,这不处理 xxx 列。为此,我尝试了以下方法

cols <- colnames(df1)


keep <- list.append(keep, colnames(df1) %>% select(contains("xxx")))

keep <- list.append(keep, filter(colnames(df1), grepl("xxx",df1)))

keep <- list.append(keep, cols %>% select(contains("xxx")))

keep <- list.append(keep, filter(cols, grepl("xxx",cols)))

keep <- list.append(keep, grepl("xxx",cols))

导致错误

no applicable method for x applied to an object of class "character" 

其中 x 是类似过滤器的函数

keep <- list.append(keep, grepl("xxx",colnames(df1)))

它将每个列名的真/假结果附加到列表中。

我不喜欢这种做事方式,所以任何和所有的解决方案都值得赞赏,一个列表对我来说似乎是最简单的方法。

标签: rdataframesubsetstring-matching

解决方案


根据 Martin Gals 的评论

df1 %>% select(contains("xxx"), df2$sample)


推荐阅读