提问人:dkcongo 提问时间:10/5/2022 最后编辑:dkcongo 更新时间:10/5/2022 访问量:453
比较两个数据帧中的某些列名
Comparing certain column names in two dataframes
问:
我正在寻找一种方法来比较两个不同的数据框列名称(仅某些列范围),并仅保留两个数据框之间具有相同共享相似性的列名称。(我只想从某个点向前比较每个数据帧。
我会有明显更多的列,所以我想看看什么在更大的数据集中效果最好。
假设我有 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)
答:
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 来过滤列名,然后通过 确定公用名。然后,最终列名由与相交的(“唯一”名称)和公共列名不匹配的列名给出。pattern
intersect
pattern
评论
0赞
dkcongo
10/5/2022
谢谢!如果 Value2、3、4 都是不同的名称,我可以使用什么替代方法来调整代码?
0赞
Maurits Evers
10/5/2022
在这种情况下,您需要考虑一个规则/逻辑,该规则/逻辑允许您将这些列与您认为“唯一”的列分开处理 (per )。正则表达式可能是一种方式;或不。魔鬼在这里的细节中。data.frame
评论
DF2 <- data.frame(Name, Identifier, City, Value2, Value3)
intersect(names(DF1), names(DF2))
产量,这是你需要的吗?c("Value2", "Value3")
DF1
DF2
DF1
DF2
ID
Location
City