使用来自一个df的索引位置值来将具有相同但重复的索引值的另一个df子集化

时间:2016-09-20 21:37:54

标签: r subset

我有两个数据帧:
DF1:

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)

3 个答案:

答案 0 :(得分:1)

您可以在loci中创建一个df2变量,该变量会在每个组中为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 :(得分:1)

这是两种方法。 <{1}}方式接近Psidom,因此如果多余则忽略。

dplyr

答案 2 :(得分:0)

以下是使用merge中的avebase R的选项。使用ave,我们创建一个按'i1'分组的序列列,然后使用'df1'创建merge

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