2016-06-28 75 views
-1

我有两个数据帧,链路和体:具有不同数目的行合并两个数据帧中的R

链路是这样的:

wpt  ID 
1   1235 
mediate 4562 
mediate 0928 
2   6351 
3   3826 
mediate 0835 

体是这样的:

wpt fuel distance 
1  2221 53927 
2  4821 48261 
3  8362 47151 

我期望的输出是这样的:

wpt  fuel distance ID 
1  2221 53927  1235 
mediate NA  NA   4562 
mediate NA  NA   0928 
2  4821 48261  6351 
3  8362 47151  3826 
mediate NA  NA   0835 

我试过使用“合并”功能,没有解决。假设使用“mediate”的行号作为拆分“body”的索引,并逐个打开它们可能会起作用。有更好的方法吗?看到有人可以帮忙吗?

在此先感谢!

+1

如果'merge'不工作,我会因为这似乎是一个典型的再次尝试“合并”问题给我。 – Psidom

+0

'merge(link,body,all = TRUE)' – alistaire

+0

我不这么认为,我想要“中介”的行在完全相同的位置。合并会自动将它们放在一起。 –

回答

2
df1 <- data.frame(wpt = c(1, "meditate", "meditate", 2,3,"meditate"), 
       ID = c(1235, 4562, 0928,6351,3826,0835)) 
df1$wpt <- as.character(df1$wpt) 


df2 <- data.frame(wpt = c(1,2,3), 
       fuel = c(1235, 4562, 0928), 
       distance = c(2,3,4)) 
df2$wpt <- as.character(df2$wpt) 


library(dplyr) 
full_join(df1, df2, by = "wpt") 

不介意值!您始终可以重新排列这些列。

 wpt ID fuel distance 
1  1 1235 1235  2 
2 meditate 4562 NA  NA 
3 meditate 928 NA  NA 
4  2 6351 4562  3 
5  3 3826 928  4 
6 meditate 835 NA  NA 
+0

提醒我,我希望在问题中指出具有“中间位置”的行的确切位置。或者这可以通过合并功能来完成。 –

+0

请检查我的编辑。冥想的价值在你想要的位置。 – Sumedh

1

我们可以使用left_join

library(dplyr) 
mutate(df2, wpt = as.character(wpt)) %>% 
        left_join(df1, ., by = 'wpt') 
#  wpt ID fuel distance 
#1  1 1235 2221 53927 
#2 mediate 4562 NA  NA 
#3 mediate 928 NA  NA 
#4  2 6351 4821 48261 
#5  3 3826 8362 47151 
#6 mediate 835 NA  NA 

或者使用data.table

library(data.table) 
setDT(df2)[, wpt := as.character(wpt)][df1, on = "wpt"] 
#  wpt fuel distance ID 
#1:  1 2221 53927 1235 
#2: mediate NA  NA 4562 
#3: mediate NA  NA 928 
#4:  2 4821 48261 6351 
#5:  3 8362 47151 3826 
#6: mediate NA  NA 835 
+1

感谢您的输入! –

2

我认为下面应该工作:

​​
+0

'setkey'是一个'data.table'函数。你需要'library(data.table)' – JackeJR

+0

你需要data.table – Koba

+0

很高兴认识不同的方法! –

3

这里的周围match()内置非合并基础R解决方案:

link[names(body)[-1L]] <- body[match(link[,1L],body[,1L]),-1L]; 
link; 
##  wpt ID fuel distance 
## 1  1 1235 2221 53927 
## 2 mediate 4562 NA  NA 
## 3 mediate 0928 NA  NA 
## 4  2 6351 4821 48261 
## 5  3 3826 8362 47151 
## 6 mediate 0835 NA  NA 

数据

link <- data.frame(wpt=c('1','mediate','mediate','2','3','mediate'),ID=c('1235','4562','0928' 
,'6351','3826','0835'),stringsAsFactors=F); 
body <- data.frame(wpt=c(1L,2L,3L),fuel=c(2221L,4821L,8362L),distance=c(53927L,48261L,47151L) 
); 
+1

如果我可以建议,请将此答案移至欺骗目标。 – zx8754

相关问题