我有一个看起来像这样的食物:
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不喜欢它。
答案 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)