使用dplyr用另一个查找替换多个ti​​bble列

时间:2017-11-26 10:27:09

标签: r dplyr

我有一个看起来像这样的食物:

        B       C       D       E       F       G
1 260-098 260-073 260-051 260-057 260-055 260-009
2 260-098 260-073 260-051 260-057 260-055 260-009
3 260-098 260-009 260-051 260-057 260-055 260-005

我有一个包含以下内容的数据库表:

  roomID rnumber
  1      1 260-005
  2      2 260-009
  3      3 260-051
  4      4 260-055
  5      5 260-057
  6      6 260-073
  7      7 260-098

我想用匹配的roomID替换tibble的条目。我以为我可以用mutate_all来做,例如

 mutate_all(function(x){
      as_tibble(x) %>% 
        left_join(roomTbl, by = c("x" = "rnumber")) %>% 
        select(roomID)
     })

但我不知道在连接中使用什么作为匿名列的名称。我尝试用"x"替换names(x),但R不喜欢它。

2 个答案:

答案 0 :(得分:2)

也许是这样的?

x = scan(what = "character")
260-098 260-073 260-051 260-057 260-055 260-009
260-098 260-073 260-051 260-057 260-055 260-009
260-098 260-009 260-051 260-057 260-055 260-005


x = matrix(x,ncol=6,byrow=TRUE)
colnames(x) = LETTERS[2:7]
x = data.frame(x)

y = scan(what = "character")
1 260-005
2 260-009
3 260-051
4 260-055
5 260-057
6 260-073
7 260-098

y = matrix(y,ncol=2,  byrow = TRUE)
colnames(y) = c("roomID", "rnumber")
y = data.frame(y)

x = x %>% gather() %>% left_join(y, by = c("value" = "rnumber")) %>% 
  select(-value) %>% group_by(key) %>%  mutate(id=1:n()) %>% 
  spread(key = key, value = roomID)

答案 1 :(得分:1)

您可以使用dplyr::mutate_all(),但需要“向量化”功能来进行匹配,因为您试图迭代每列中的每一行。在这里,我使用match

myTbl %>% mutate_all(funs(roomTbl$roomID[match(., roomTbl$rnumber)]))

数据读入:

myTbl <- read.table(text = "B       C       D       E       F       G
260-098 260-073 260-051 260-057 260-055 260-009
260-098 260-073 260-051 260-057 260-055 260-009
260-098 260-009 260-051 260-057 260-055 260-005",
header = TRUE, stringsAsFactors = FALSE)

roomTbl <- read.table(text = "roomID rnumber
1 260-005
2 260-009
3 260-051
4 260-055
5 260-057
6 260-073
7 260-098",
header = TRUE, stringsAsFactors = FALSE)