用另一个表替换列
假设我有一个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
有什么提示吗?
您可以使用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)
谢谢,但是当我使用你的脚本到另一个数据集,我得到抱怨**错误:行重复标识符(5464,5465,5467 ..... **,知道为什么? – user3058889
@ user3058889。是的,你有重复(var,sid,-inter)%>%left_join(source,by ='sid')%>%select(-sid)%>%group_by(var)%> %mutate(new = seq(n()))%>%spread(var,rid)%>%select(-new) – Sotos
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
感谢您的帮助,但您的脚本只能用于第一次替换,但是如果我在'df'文件中重复了元素?因为在我的情况下,我在'id1','id2'和'id3'列有几个重复。我更新了我的问题。 @F。 Privé – user3058889
我知道我做错了什么。尝试切换匹配中的元素,然后使用tmp []
我已经使用这个更好的解决方案编辑了我的答案。 –
尝试'DF [] akrun