比较两个数据框的列名。如果匹配,则提取行值

时间:2021-06-01 14:05:27

标签: r dataframe

我目前正在尝试比较两个数据框(例如 df1 和 df2)的列名,并从其中一个 (df2) 中提取值,如果匹配,则创建新的(第三个)数据框架。

示例,

df1 <- data.frame(x3=469, x4=465, x7=501, x10=467, x12=459)
df2 <- data.frame(x3="IL_NA1A_P", x4="IL_NA3D_P", x5="PROD005_P", x6="PROD008_P", 
                  x7="PROD009_P", x8="PROD010_P", x9="PROD012_P", x10="PROD014_P",
                  x11="PROD021_P", x12="PROD023A_P")

我希望输出与以下内容更多,

x3  x4  x7 x10 x12
IL_NA1A_P IL_NA3D_P PROD009_P PROD014_P PROD023A_P

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

这行得通:

df2[, colnames(df2) %in% colnames(df1)]
    x3        x4        x7       x10        x12
1 IL_NA1A_P IL_NA3D_P PROD009_P PROD014_P PROD023A_P

您只需检查 df2 的哪些列名也出现在 df1 中,然后从 df2 中选择这些列。

答案 1 :(得分:1)

我们也可以使用

library(dplyr)
df2 %>%
    select_at(vars(names(df1))

答案 2 :(得分:0)

如果 df1 中存在所有 df2 列名称,您可以使用 -

df2[names(df1)]

#         x3        x4        x7       x10        x12
#1 IL_NA1A_P IL_NA3D_P PROD009_P PROD014_P PROD023A_P

如果 df1 中只有少数 df2 列名称,您可以使用 -

df2[intersect(names(df2), names(df1))]

或在 dplyr 中。

library(dplyr)
df2 %>%  select(any_of(names(df1)))