在数据框之间进行条件搜索,匹配和替换值

时间:2019-03-23 02:49:44

标签: r dataframe tidyverse

我有两个数据框,如下所示。我想用匹配时从数据框2中获取的相应值替换数据框1中的文本(单元格)。我试图在下面举一个简单的例子。 我在R方面的经验有限,但无法马上想到一个简单的解决方案。任何帮助/建议将不胜感激。

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                     col2 = c("A", "B", "C", "D"),
                     col3 = c("B", "E", "F", "D"))

input_2 = data.frame(colx = c("A", "B", "C", "D", "E", "F"), 
                coly = c(1, 2, 3, 4, 5, 6))

output = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                    col2 = c(1, 2, 3, 4),
                    col3 = c(2, 5, 6, 4))

3 个答案:

答案 0 :(得分:1)

使用tidyverse的示例。我的解决方案涉及将两次合并到input_2,但是匹配不同的列。最后一个管道清理数据框并重命名列。

library(tidyverse)

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                     col2 = c("A", "B", "C", "D"),
                     col3 = c("B", "E", "F", "D"))

input_2 = data.frame(colx = c("A", "B", "C", "D", "E", "F"), 
                coly = c(1, 2, 3, 4, 5, 6))


output = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), 
                    col2 = c(1, 2, 3, 4),
                    col3 = c(2, 5, 6, 4))


input_1 %>% inner_join(input_2, by = c("col2" = "colx")) %>%
    inner_join(input_2, by = c("col3" = "colx")) %>% 
    select(col1, coly.x, coly.y) %>%
    magrittr::set_colnames(c("col1", "col2", "col3"))

答案 1 :(得分:1)

这是一个 tidyverse 解决方案:

library(tidyverse)
mutate_at(input_1, -1, ~deframe(input_2)[as.character(.)])
#   col1 col2 col3
# 1  ex1    1    2
# 2  ex2    2    5
# 3  ex3    3    6
# 4  ex4    4    4

deframe从数据帧构建命名向量,这种情况下更方便。

as.character是必需的,因为您有因子列

答案 2 :(得分:0)

使用基数R的一种方法是遍历要使用lapplymatchinput_2$colx来更改值的列,并获取相应的coly值。

input_1[-1] <- lapply(input_1[-1], function(x) input_2$coly[match(x, input_2$colx)])

input_1
#  col1 col2 col3
#1  ex1    1    2
#2  ex2    2    5
#3  ex3    3    6
#4  ex4    4    4

实际上,您可以不使用lapply而离开,可以直接unlist的值和match

input_1[-1] <- input_2$coly[match(unlist(input_1[-1]), input_2$colx)]