2016-09-20 40 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 
相关问题