通过R中数据帧中的记录匹配矢量值

时间:2015-05-01 14:19:20

标签: r sampling

我有一个值为ref的向量,如下所示:

r

和一个包含20条记录和两列的数据框 r<-c(1,3,4,6,7)

df

使用 id<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,1,4,15,16,17,18,19,20) freq<-c(1,3,2,4,5,6,6,7,8,3,3,1,6,9,9,1,1,4,3,7,7) df<-data.frame(id,freq) 向量,我需要以r的{​​{1}}值的方式从df中提取记录样本(以新数据框的形式),将等于我freq向量中的值。不用说,如果它找到具有相同r值的多个记录,则应随机选择其中一个。例如,一种可能的结果可能是:

freq

如果有人能帮助我,我会感激不尽。

3 个答案:

答案 0 :(得分:6)

您可以尝试data.table

library(data.table)
setDT(df)[freq %in% r,sample(id,1L) , freq]

或使用base R

aggregate(id~freq, df, subset=freq %in% r, FUN= sample, 1L)

更新

如果您的矢量“r”具有重复值,并希望根据“r”中唯一元素的长度对数据集('df')进行采样

  r <-c(1,3,3,4,6,7)
  res <- do.call(rbind,lapply(split(r, r), function(x) {
           x1 <- df[df$freq %in% x,]
           x1[sample(1:nrow(x1),length(x), replace=FALSE),]}))
  row.names(res) <- NULL

答案 1 :(得分:4)

您可以使用“dplyr”中的filtersample_n

library(dplyr)
set.seed(1)
df %>% 
  filter(freq %in% r) %>% 
  group_by(freq) %>% 
  sample_n(1)
# Source: local data frame [5 x 2]
# Groups: freq
# 
#   id freq
# 1 12    1
# 2 10    3
# 3 17    4
# 4 13    6
# 5  8    7

答案 2 :(得分:1)

您是否尝试过使用converter功能或map_list_of(1, 'a')(2, 'b').convert_to_container<InnerMap>() ?这可能不是一个快速/干净的解决方案,但只使用match()函数:

%in%