r - 如何根据具有不同元素数量的另一个数据框分配值?
问题描述
这是一个可重现的示例:
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
是标准数据框。我想在其中创建一个新列VAL
并data
根据数据框分配值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 循环之外,还有其他有效的方法吗?
解决方案
您可以使用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
推荐阅读
- c# - AutoMapper - 继承保留引用
- aws-sdk - carrierwave-aws:Rails API 应用程序文件上传失败并出现 NoMethodError - nil:NilClass 的未定义方法“匹配”
- azure - Azure 内部负载均衡器与 Azure Kubernetes 服务不工作
- javascript - mongo db JS .map 尽管在本地主机中工作,但它在 GAE 中不起作用?或者是其他东西
- protocol-buffers - 通过 php sdk 创建会话上下文时出错
- node.js - 从 .json 文件创建 .env 文件
- python - 如何使用硒驱动程序python单击覆盖中的第一个链接
- ajax - 可以在ajax请求的响应中获取django设置的cookies
- reactjs - React:使变量在函数外重用
- ruby - Rails 无法在类初始化方法中生成实例变量以生成 httparty 请求