我想从一列函数中的数据框中随机提取n
行。
所以用这个例子:
# Reproducible example
df <- as.data.frame(matrix(0,2e+6,2))
df$V1 <- runif(nrow(df),0,1)
df$V2 <- sample(c(1:10),nrow(df), replace=TRUE)
df$V3 <- sample(c("A","B","C"),nrow(df), replace=TRUE)
我想为n=10
的每个值提取V2
行。
# Example of what I need with one value of V2
df1 <- df[which(df$V2==1),]
str(df1)
df1[sample(1:nrow(df1),10),]
我不想做任何for-loop
因此我尝试使用tapply
这一行:
df_objective <- tapply(df$V1, df$V2, function(x) df[sample(1:nrow(df),10),"V2"])
接近我想要的但我丢失了数据框的第三列。
我试过这个有完整的子集:
df_objective <- by(cbind(df$V1,df$V3), df$V2, function(x) df[sample(1:nrow(df),10),"V2"])
但它没有帮助。
如何保留子集中的所有列?
答案 0 :(得分:2)
听起来你只是想从“dplyr”中寻找像sample_n
这样的东西:
library(dplyr)
df %>% group_by(V2) %>% sample_n(10)
# Source: local data frame [100 x 3]
# Groups: V2
#
# V1 V2 V3
# 1 0.51099392 1 B
# 2 0.87098866 1 A
# 3 0.13647752 1 B
# 4 0.15348834 1 B
# 5 0.94096127 1 B
# 6 0.05673849 1 A
# 7 0.69960842 1 C
# 8 0.02246671 1 C
# 9 0.88903430 1 B
# 10 0.52128253 1 A
# .. ... .. ..
或者,我的“splitstackshape”包中有stratified
。
library(splitstackshape)
stratified(df, "V2", 10)
答案 1 :(得分:2)
你可以尝试
library(data.table)
setDT(df)[, .SD[sample(.N, 10)] , V2]
或@Frank建议的更快的选项
setDT(df)[df[,sample(.I,10),V2]$V1]
答案 2 :(得分:1)
您想要从行中进行抽样,因此应该是tapply
的第一个arg,而不是V1
:
myrows <- unlist(tapply(1:nrow(df),df$V2,sample,size=10))
df1[myrows,]