首页 > 解决方案 > 匹配变量名

问题描述

我有一个目前看起来像这样的数据集:

Actor1    Actor2
1           2
1           4
2           5
1           3
2           6
4           5
2           7
3           7

我拥有的另一个数据集确定了每个数字的含义。像这样的东西:

ID    Label
1     Walmart
2     Apple
3     Microsoft
4     Vodafone
5     BMW
6     Berkshire Hathaway
7     Bank of America

我需要使用第二个数据集来识别第一个数据集中的演员是谁,我希望我的最终数据集看起来像:

Actor1     Actor2
Walmart     Apple
Walmart    Vodafone
Apple       BMW
.
.
.

等等。我最初使用 ifelse 函数并手动完成,但耗时太长。然后我通过创建三个数据文件(文件 1:Actor 1;文件 2:Actor 2;文件 3:ID 和名称)尝试了合并功能。但是 Actor1 和 Actor2 列之间的顺序混乱了。

感觉这应该很简单,但我很困惑。有什么好主意吗?

先感谢您。

标签: r

解决方案


基本 R 方法

d <- with(df2, setNames(ID, Label))
list2DF(Map(function(x, y) names(d)[match(x, y)], df1, list(d)))

     Actor1             Actor2
1   Walmart              Apple
2   Walmart           Vodafone
3     Apple                BMW
4   Walmart          Microsoft
5     Apple Berkshire Hathaway
6  Vodafone                BMW
7     Apple    Bank of America
8 Microsoft    Bank of America

一个更短的(感谢@akrun 的评论)

df1[] <- df2$Label[as.matrix(df1)]

数据

> dput(df1)
structure(list(Actor1 = c("Walmart", "Walmart", "Apple", "Walmart",
"Apple", "Vodafone", "Apple", "Microsoft"), Actor2 = c("Apple",
"Vodafone", "BMW", "Microsoft", "Berkshire Hathaway", "BMW",
"Bank of America", "Bank of America")), row.names = c(NA, -8L
), class = "data.frame")

> dput(df2)
structure(list(ID = 1:7, Label = c("Walmart", "Apple", "Microsoft", 
"Vodafone", "BMW", "Berkshire Hathaway", "Bank of America")), class = "data.frame", row.names = 
c(NA,
-7L))

推荐阅读