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

通过R中数据帧中的记录匹配向量值,r,sampling,R,Sampling,我有一个值向量r,如下所示: r<-c(1,3,4,6,7) 使用r向量,我需要从df中提取一个记录样本(以新数据帧的形式),使记录的freq值等于我在r向量中的值。不用说,如果它发现多个记录具有相同的freq值,它应该随机选择其中一个。例如,一种可能的结果是: id frequency 12 1 10 3 4 4 7 6 8 7 如果有人能帮助我,我将不

我有一个值向量
r
,如下所示:

 r<-c(1,3,4,6,7)
使用
r
向量,我需要从
df
中提取一个记录样本(以新数据帧的形式),使记录的
freq
值等于我在
r
向量中的值。不用说,如果它发现多个记录具有相同的
freq
值,它应该随机选择其中一个。例如,一种可能的结果是:

   id     frequency
   12         1
   10         3
   4          4
   7          6
   8          7

如果有人能帮助我,我将不胜感激。

您可以使用“dplyr”中的
过滤器和
示例:


您可以尝试
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

r您是否尝试过在%
中使用
match()
函数或
%?这可能不是一个快速/干净的解决方案,但只使用
base R
函数:

rUnique <- unique(r)
df2 <- df[df$freq %in% rUnique,]
x <- data.frame(id = NA, freq = rUnique) 

for (i in 1:length(rUnique)) {
    x[i,1] <- sample(df2[df2[, 2] == rUnique[i], 1], 1)
}
print(x)

rUnique谢谢。。很明显,R版本3.0.1不提供“dplyr”软件包。你知道有什么替代方案吗?有什么理由在
setDT(df)[freq%in%R,sample(id,1L),freq]
?弗兰克,谢谢,它看起来更好。@AliTamaddoni你可以做
unique(R)
然后用它替换代码中的
r
,虽然它在没有
unique(r)
@akrun的情况下也可以工作,我的意思是它仍然保留两个3s,并为每个3s找到一个随机匹配项。谢谢!这还不是一个答案。@hsl我的一个问题是,如果不使用
unique(r)
你可以保留两个3s(或任意多个3)。只需将所有的
rUnique
替换为原始向量
r
。但是,如果您需要,您可能会得到类似的id-freq对。如果不需要,代码将更加复杂,我相信存在一个更简单的解决方案。
  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
rUnique <- unique(r)
df2 <- df[df$freq %in% rUnique,]
x <- data.frame(id = NA, freq = rUnique) 

for (i in 1:length(rUnique)) {
    x[i,1] <- sample(df2[df2[, 2] == rUnique[i], 1], 1)
}
print(x)