首页 > 解决方案 > 如何根据具有不同元素数量的另一个数据框分配值?

问题描述

这是一个可重现的示例:

data <- data.frame(A1=c("ao","ao","zo","ao","zo","ao","jo","jo","ko"),B1=c("y1","y1","y2","y2","y1","y1","y2","y2","y1"))

> data
  A1 B1
1 ao y1
2 ao y1
3 zo y2
4 ao y2
5 zo y1
6 ao y1
7 jo y2
8 jo y2
9 ko y1

sor <- data.frame(A1=c("ao","ko","jo","zo","po"),y1=c(10,20,30,0,50),y2=c(22,33,44,55,66))

> sor
  A1 y1 y2
1 ao 10 22
2 ko 20 33
3 jo 30 44
4 zo  0 55
5 po 50 66

这里,data是主数据框,sor是标准数据框。我想在其中创建一个新列VALdata根据数据框分配值sor(必须在行和列中进行检查)并且 NA 是它不存在于sor.

这是必需的输出。

> data
  A1 B1 VAL
1 ao y1  10
2 ao y1  10
3 zo y2  55
4 ao y2  22
5 zo y1   0
6 ao y1  10
7 jo y2  44
8 jo y2  44
9 ko y1  20

使用 for 循环可以做到这一点,我已经厌倦并使用 for 循环得到了结果。但是我的数据框中有大量行,使用 for 循环效率不高。

除了在 R 中使用 for 循环之外,还有其他有效的方法吗?

标签: r

解决方案


您可以使用data.table包:

library(data.table)
setDT(data)[sor, VAL := i.y1, on = "A1"]

#    A1 B1 VAL
# 1: ao y1  10
# 2: ao y1  10
# 3: zo y2   0
# 4: ao y2  10
# 5: zo y1   0
# 6: ao y1  10
# 7: jo y2  30
# 8: jo y2  30
# 9: ko y1  20

推荐阅读