2016-09-20 42 views
2

我有兩個dataframes:
DF1:使用從一個DF索引位置值子集相同,但repititive指數另一個的DF值

i1<-c(0,1,2,3,4) 
loci<-c(2,2,3,2,3) 
df1<-data.frame(i1,loci) 

DF2:

i1<-c(0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,4,4,4,4) 
x<-c(343,434,23,232,3,34,422,245,2,2,2,4,553,234,532,234,23,34,23) 
y<-c(33,545,88,8,88,86,4565,3434,234,34,545,234,2343,35,4,5,35,45,55) 
df2<-data.frame(i1,x,y) 

我想要實現這個 -

i1<-c(0,1,2,3,4) 
x<-c(434,422,2,234,34) 
y<-c(545,4565,234,35,45) 
df3<-data.frame(i1,x,y) 
+0

非常感謝你們merge! 所有的選項都很好用! – Truemean

回答

0

下面是使用mergeavebase R一個選項。隨着ave,我們通過創建「I1」分組順序列,然後用「DF1」

dfN <- merge(df1, transform(df2, loci= ave(i1, i1, FUN = seq_along)))[-2] 
1

您可以在中創建loci變量它通過i1給每個組內的行索引,然後做一個right_join()df1,這裏是dplyr一個選項:

library(dplyr) 

df2 %>% 
    group_by(i1) %>% 
    mutate(loci = row_number()) %>% 
    right_join(df1) %>% 
    select(-loci) 

# Source: local data frame [5 x 3] 
# Groups: i1 [5] 

#  i1  x  y 
# <dbl> <dbl> <dbl> 
# 1  0 434 545 
# 2  1 422 4565 
# 3  2  2 545 
# 4  3 234 35 
# 5  4 34 45 
1

這裏有兩種方法。 dplyr的方式接近Psidom,因此如果多餘則忽略。

library(dplyr) 
df1 %>% left_join(df2, by="i1") %>% group_by(i1) %>% slice(loci[1]) 
# Source: local data frame [5 x 4] 
# Groups: i1 [5] 
# 
#  i1 loci  x  y 
# <dbl> <dbl> <dbl> <dbl> 
# 1  0  2 434 545 
# 2  1  2 422 4565 
# 3  2  3  2 545 
# 4  3  2 234 35 
# 5  4  3 34 45 

library(data.table) 
setDT(df1) 
setDT(df2) 
df1[df2, on="i1"][,.SD[loci[1]], by=i1] 
# i1 loci x y 
# 1: 0 2 434 545 
# 2: 1 2 422 4565 
# 3: 2 3 2 545 
# 4: 3 2 234 35 
# 5: 4 3 34 45 
相關問題