根据具有重复值的矢量选择数据帧行

时间:2016-05-20 22:20:24

标签: r dataframe subset

我想要的可以描述为:给出一个数据框,包含所有的案例 - 控制对。在以下示例中,y是案例对照对的id。我的数据集中有3对。我正在对y的不同值进行重新采样(该对将被选中或两者都不被选中)。

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3))
> sample_df
  x y
1 1 1
2 2 1
3 3 2
4 4 2
5 5 3
6 6 3
select_y = c(1,3,3)
select_y
> select_y
[1] 1 3 3

现在,我计算了一个包含我想要重新采样的对的向量,它是上面的select_y。这意味着病例对照编号1将在我的新样本中,编号3也将在我的新样本中,但它将发生2次,因为有两个3.所需的输出将是:

x y
1 1
2 1
5 3
6 3
5 3
6 3

除了编写for循环之外,我找不到有效的方法......

解决方案: 基于@HubertL,经过一些修改后,可以进行矢量化'方法看起来像:

sel_y <- as.data.frame(table(select_y))
> sel_y
  select_y Freq
1        1    1
2        3    2
sub_sample_df = sample_df[sample_df$y%in%select_y,]
> sub_sample_df
  x y
1 1 1
2 2 1
5 5 3
6 6 3
match_freq = sel_y[match(sub_sample_df$y, sel_y$select_y),]
> match_freq
    select_y Freq
1          1    1
1.1        1    1
2          3    2
2.1        3    2
sub_sample_df$Freq = match_freq$Freq
rownames(sub_sample_df) = NULL
sub_sample_df
> sub_sample_df
  x y Freq
1 1 1    1
2 2 1    1
3 5 3    2
4 6 3    2
selected_rows = rep(1:nrow(sub_sample_df), sub_sample_df$Freq)
> selected_rows
[1] 1 2 3 3 4 4
sub_sample_df[selected_rows,]
    x y Freq
1   1 1    1
2   2 1    1
3   5 3    2
3.1 5 3    2
4   6 3    2
4.1 6 3    2

2 个答案:

答案 0 :(得分:1)

另一种没有循环的方法:

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3))

row_names <- split(1:nrow(sample_df),sample_df$y)

select_y = c(1,3,3)

row_num <- unlist(row_names[as.character(select_y)])

ans <- sample_df[row_num,]

答案 1 :(得分:0)

我找不到没有循环的方法,但至少它不是for循环,并且每个频率只有一次迭代:

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3))
select_y = c(1,3,3)
sel_y <- as.data.frame(table(select_y))
do.call(rbind, 
        lapply(1:max(sel_y$Freq), 
               function(freq) sample_df[sample_df$y %in% 
                              sel_y[sel_y$Freq>=freq, "select_y"],]))

   x y
1  1 1
2  2 1
5  5 3
6  6 3
51 5 3
61 6 3