通过 R 中的数据帧中的记录匹配向量值
Matching vector values by records in a data frame in R
我有一个值向量 r
如下:
r<-c(1,3,4,6,7)
和一个包含 20 条记录和两列的数据框 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
向量,我需要从 df
中提取记录样本(以新数据框的形式),其方式是 freq
的值记录,将等于我在 r
向量中的值。不用说,如果它找到多个具有相同 freq
值的记录,它应该随机选择其中一个。例如,一种可能的结果可能是:
id frequency
12 1
10 3
4 4
7 6
8 7
如果有人能帮助我,我将不胜感激。
您可以使用 filter
和 sample_n
来自 "dplyr":
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
你可以试试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
您是否尝试过使用 match()
函数或 %in%
?这可能不是 fast/clean 解决方案,但仅使用 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)
我有一个值向量 r
如下:
r<-c(1,3,4,6,7)
和一个包含 20 条记录和两列的数据框 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
向量,我需要从 df
中提取记录样本(以新数据框的形式),其方式是 freq
的值记录,将等于我在 r
向量中的值。不用说,如果它找到多个具有相同 freq
值的记录,它应该随机选择其中一个。例如,一种可能的结果可能是:
id frequency
12 1
10 3
4 4
7 6
8 7
如果有人能帮助我,我将不胜感激。
您可以使用 filter
和 sample_n
来自 "dplyr":
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
你可以试试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
您是否尝试过使用 match()
函数或 %in%
?这可能不是 fast/clean 解决方案,但仅使用 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)