r

时间:2015-05-12 15:45:02

标签: r

我想从一列函数中的数据框中随机提取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"])

但它没有帮助。

如何保留子集中的所有列?

3 个答案:

答案 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,]