首页 > 解决方案 > 将一个数据帧中的值替换为另一个数据帧

问题描述

我有两个数据框,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 之类的功能transmutelibrary(dplyr)但我无法找到解决方案。如果有人知道如何使用transmute或其他功能,请告诉我!

标签: r

解决方案


我们可以创建一个逻辑索引并使用它来子集替换值

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))

推荐阅读