假设我的df如下所示。
df <- read.table(textConnection("
id1 id2 id3 inter
1 2 3 7.343
6 5 4 2.454
1 5 6 3.234
"), header = TRUE)
我希望按源数据框替换列id1
,id2
和id3
。
source <- read.table(textConnection("
sid rid
1 a
2 b
3 c
4 43454
5 2254
6 43
"), header = TRUE)
如果我发现source$sid
等于df$id1
,df$id2
或df$id3
,
然后我想将它们替换为source$rid
。
结果我可以看到。
id1 id2 id3 inter
a b c 7.343
43 2254 43454 2.454
a 2254 43 3.234
请提示吗?
答案 0 :(得分:2)
tmp <- as.matrix(df[paste0("id", 1:3)])
ind <- match(tmp, source$sid)
tmp[] <- as.character(source$rid)[ind]
df[paste0("id", 1:3)] <- tmp
答案 1 :(得分:1)
您可以再次使用tidyverse
到gather
,left_join
然后spread
,即
library(tidyverse)
df %>%
gather(var, sid, -inter) %>%
left_join(source, by = 'sid') %>%
select(-sid) %>%
spread(var, rid)
# inter id1 id2 id3
#1 2.454 43 2254 43454
#2 3.234 a 2254 43
#3 7.343 a b c
根据您的评论,您似乎有一些重复。以下var
分组并创建seq
个唯一值就足够了(虽然我无法测试,因为您的示例不会产生此错误),
df %>%
gather(var, sid, -inter) %>%
left_join(source, by = 'sid') %>%
select(-sid) %>%
group_by(var) %>%
mutate(new = seq(n())) %>%
spread(var, rid) %>%
select(-new)