r - 将一个数据帧中的值替换为另一个数据帧
问题描述
我有两个数据框,A 和 B,通过导出 csv 数据构建,可以恢复如下(非常简化):
dataA <- read.csv2("dataA.csv", header = TRUE))
# Name DataA_1 DataA_2 DataA_3 DataA_4
# 1 4 5 6 5
# 2 7 5 6 4
# 3 6 5 5 4
# 4 3 3 3 4
# 5 1 2 4 3
dataB <- read.csv2("dataB.csv", header = TRUE)
# DataB_1 DataB_2 DataB_3 DataB_4
# 1 8 3 5
我要做的就是用数据框B中与同一列对应的值替换数据框A(第一列除外)中高于一定数量的所有值,比如说4。例如,因为DataA_2
是5对于 te 2nd person (element (2,2) in A) ,我想将其替换DataB_2
为数据框 B 的,即 8。最终结果应如下所示:
# Name DataA_1 DataA_2 DataA_3 DataA_4
# 1 4 8 3 5
# 2 1 8 3 4
# 3 1 8 3 4
# 4 3 3 3 4
# 5 1 2 2 3
我已经通过构建带有循环的算法来资助一种方法,但我对这个解决方案并不满意,因为我想要更短更快的东西。我很确定可以使用 in 之类的功能transmute
,library(dplyr)
但我无法找到解决方案。如果有人知道如何使用transmute
或其他功能,请告诉我!
解决方案
我们可以创建一个逻辑索引并使用它来子集替换值
i1 <- dataA[-1] > 4
dataA[-1][i1] <- dataB[col(dataA[-1])][i1]
-输出
dataA
# Name DataA_1 DataA_2 DataA_3 DataA_4
#1 1 4 8 3 5
#2 2 1 8 3 4
#3 3 1 8 3 4
#4 4 3 3 3 4
#5 5 1 2 4 3
或与dplyr
library(dplyr)
library(stringr)
dataA %>%
mutate(across(-Name, ~ replace(., . > 4,
dataB[[str_replace(cur_column(), 'A', 'B')]])))
# Name DataA_1 DataA_2 DataA_3 DataA_4
#1 1 4 8 3 5
#2 2 1 8 3 4
#3 3 1 8 3 4
#4 4 3 3 3 4
#5 5 1 2 4 3
数据
dataA <- structure(list(Name = 1:5, DataA_1 = c(4L, 7L, 6L, 3L, 1L), DataA_2 = c(5L,
5L, 5L, 3L, 2L), DataA_3 = c(6L, 6L, 5L, 3L, 4L), DataA_4 = c(5L,
4L, 4L, 4L, 3L)), class = "data.frame", row.names = c(NA, -5L
))
dataB <- structure(list(DataB_1 = 1L, DataB_2 = 8L, DataB_3 = 3L, DataB_4 = 5L), class = "data.frame", row.names = c(NA,
-1L))
推荐阅读
- c# - 匿名类型的 C# 类型转换异常,为什么?
- sql - 合并具有相同列但不同值的两个表,并仅返回不匹配的表
- python - 如何在写入 CSV 之前删除数据中不必要的换行符
- docker - Kubectl 无法在 Windows 10 上连接
- network-programming - 在 NetLogo 中创建具有 *both-free 属性和集群的网络
- typescript - 如何修复'无法分配给部分
' 在子类方法中? - kubernetes - Google Cloud Kubernetes - 与 Cloudflare 的负载均衡器会话亲和性
- javascript - Swiper carousel IE11 错误:图像过度拉伸
- python - 如何使用 pandas 模块合并(即“concat”)100 多个 .csv 文件?
- javascript - 如何在 Javascript 中创建多维堆栈?