比较两个数据帧中的某些列名

Comparing certain column names in two dataframes

提问人:dkcongo 提问时间:10/5/2022 最后编辑:dkcongo 更新时间:10/5/2022 访问量:453

问:

我正在寻找一种方法来比较两个不同的数据框列名称(仅某些列范围),并仅保留两个数据框之间具有相同共享相似性的列名称。(我只想从某个点向前比较每个数据帧。

我会有明显更多的列,所以我想看看什么在更大的数据集中效果最好。

假设我有 DF1

编号 位置 值2 值3 值4
第一 公园 4 3 3
第二 房子 2 5 2
第二 谷仓 4 5 6
第三 1 8 8
第三 飞机场 7 5 4
第四 汽车 4 5 1

和 DF2

名字 标识符 城市 值2 值3
杰夫 ISE2型 西雅图 1 6
乔治 GSY7型 休斯顿 2 2
卡尔 BHU1型 迈阿密 3 7
话筒 POI0的 洛杉矶 8 8
亚麻布 ANN1型 直流 5 4
猪肉 CNU4型 波特兰 5 1

在 DF1 中,我们将保留 ID 和位置列,对于 DF2,我们将保留名称、标识符和城市。我的目标是比较其他数字列,看看名称中是否有匹配项。因此,在本例中,匹配项为“Value2”和“Value3”。

因此,处理后的数据帧为:

新款 DF1

编号 位置 值2 值3
第一 公园 4 3
第二 房子 2 5
第二 谷仓 4 5
第三 1 8
第三 飞机场 7 5
第四 汽车 4 5

和新的DF2

名字 标识符 城市 值2 值3
杰夫 ISE2型 西雅图 1 6
乔治 GSY7型 休斯顿 2 2
卡尔 BHU1型 迈阿密 3 7
话筒 POI0的 洛杉矶 8 8
亚麻布 ANN1型 直流 5 4
猪肉 CNU4型 波特兰 5 1

是否有一种方式比较每个 DF 的列名并将其与另一种进行比较?我将不胜感激。谢谢!

ID <- c("First", "Second", "Second", "Third", "Third", "Fourth")
Location <- c("Park","House","Barn","Lake","Airport","Car")
Value2 <- c(4,2,4,1,7,4)
Value3 <- c(3,5,5,8,5,5)
Value4 <- c(3,2,6,8,4,1)
DF1 <- data.frame(ID, Location, Value2, Value3, Value4)
Name <- c("Jeff", "George", "Carl", "Mike", "Linel", "Pork")
Identifier <- c("ISE2","GSY2","BHU1","POI0","ANN1","CNU4")
City <- c("Seattle","Houston","Miami","Los Angeles","DC","Portland")
Value2 <- c(1,2,3,8,5,5)
Value3 <- c(6,2,7,8,4,1)
DF2 <- data.frame(Name, Identifier, City, Value2, Value3)
R DataFrame 比较 列排序

评论

1赞 r2evans 10/5/2022
我想你的意思是DF2 <- data.frame(Name, Identifier, City, Value2, Value3)
3赞 r2evans 10/5/2022
intersect(names(DF1), names(DF2))产量,这是你需要的吗?c("Value2", "Value3")
0赞 Maurits Evers 10/5/2022
^ +1:帖子底部的示例数据令人困惑,与您的问题描述不符(并且具有相同的列名)。此外,您的原始示例数据还具有其他列,这些列不在 和 之间共享,但您似乎希望保留这些列(、、等)。DF1DF2DF1DF2IDLocationCity
0赞 dkcongo 10/5/2022
哎 呦!修复了 DF2 名称部分。我想将名称相交,但是有没有办法防止自定义数量的列“相交”?

答:

1赞 Maurits Evers 10/5/2022 #1

下面是一个基本 R 选项

# Common column-name pattern across `data.frame`
pattern <- "Value"
common_nms <- intersect(
    names(DF1)[grep(pattern, names(DF1))], 
    names(DF2)[grep(pattern, names(DF2))])

# Unique and and "pattern-shared" columns in `DF1`
DF1[c(names(DF1)[-grep(pattern, names(DF1))], common_nms)]
#      ID Location Value2 Value3
#1  First     Park      4      3
#2 Second    House      2      5
#3 Second     Barn      4      5
#4  Third     Lake      1      8
#5  Third  Airport      7      5
#6 Fourth      Car      4      5

# Unique and and "pattern-shared" columns in `DF2`
DF2[c(names(DF2)[-grep(pattern, names(DF2))], common_nms)]
#    Name Identifier        City Value2 Value3
#1   Jeff       ISE2     Seattle      1      6
#2 George       GSY2     Houston      2      2
#3   Carl       BHU1       Miami      3      7
#4   Mike       POI0 Los Angeles      8      8
#5  Linel       ANN1          DC      5      4
#6   Pork       CNU4    Portland      5      1

这个想法是使用 a 来过滤列名,然后通过 确定公用名。然后,最终列名由与相交的(“唯一”名称)和公共列名不匹配的列名给出。patternintersectpattern

评论

0赞 dkcongo 10/5/2022
谢谢!如果 Value2、3、4 都是不同的名称,我可以使用什么替代方法来调整代码?
0赞 Maurits Evers 10/5/2022
在这种情况下,您需要考虑一个规则/逻辑,该规则/逻辑允许您将这些列与您认为“唯一”的列分开处理 (per )。正则表达式可能是一种方式;或不。魔鬼在这里的细节中。data.frame