R:基于多个因素创建多个重采样数据集

时间:2018-01-11 15:13:09

标签: r

我需要从大型数据库创建多个(几千个)重采样数据集。我有三个分类变量。站点(S),Transect(T),Quadrat(Q)。响应变量是Value(V),它是特定S,T和&的结果。 Q组合。每个站点的每个样带都有四边形。我在下面贴了一个缩写的数据集。

S   T   Q   V
A   1   1   8
A   1   2   5
A   1   3   0
A   2   1   0
A   2   2   15
A   2   3   0
A   3   1   0
A   3   2   25
A   3   3   0
B   1   1   0
B   1   2   1
B   1   3   0
B   2   1   33
B   2   2   1
B   2   3   2
B   3   1   0
B   3   2   207
B   3   3   0
C   1   1   0
C   1   2   1
C   1   3   0
C   2   1   45
C   2   2   33
C   2   3   0
C   3   1   0
C   3   2   1
C   3   3   0

对于给定的站点,重新采样的数据集将包含从横断面1到n的四元组的##,其中##将是每个站点每个横断面(T)的样方数(Q)(S) 。我不是试图基于S,T和&amp ;;重新采样数据集。问:我希望能够根据我定义的条件重新采样用户定义的行数。例如,如果我选择基于每个站点(S)的每个横断面(T)的2个样方(Q)进行重新采样,我设想重新采样的数据集看起来像下面的示例。

S   T   Q   V
A   1   1   8
A   1   3   0
A   2   1   0
A   2   2   15
A   3   2   25
A   3   3   0
B   1   2   1
B   1   3   0
B   2   2   1
B   2   3   2
B   3   1   0
B   3   2   207
C   1   1   0
C   1   3   0
C   2   1   45
C   2   3   0
C   3   2   1
C   3   3   0

如果这没有意义,请告诉我,我会修改,直到确实如此。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

考虑by Site Transect 因素对数据帧进行切片,然后对随机行进行采样:

set.seed(444)
quads <- 2

# BUILD LIST OF SUBSETTED RANDOM SAMPLED DATAFRAMES 
df_list <- by(df, df[c("S", "T")], FUN=function(df) df[sample(nrow(df), quads),])

# STACK ALL DATAFRAMES INTO ONE FINAL DF
sample_df <- do.call(rbind, df_list)

# SORT DATAFRAME BY S AND T    
sample_df <- with(sample_df, sample_df[order(S, T),])

# RESET ROW NAMES
row.names(sample_df) <- NULL

sample_df
#    S T Q   V
# 1  A 1 1   8
# 2  A 1 3   0
# 3  A 2 2  15
# 4  A 2 1   0
# 5  A 3 1   0
# 6  A 3 3   0
# 7  B 1 2   1
# 8  B 1 1   0
# 9  B 2 3   2
# 10 B 2 1  33
# 11 B 3 1   0
# 12 B 3 2 207
# 13 C 1 1   0
# 14 C 1 2   1
# 15 C 2 1  45
# 16 C 2 3   0
# 17 C 3 3   0
# 18 C 3 2   1

数据

txt = '
S   T   Q   V
A   1   1   8
A   1   2   5
A   1   3   0
A   2   1   0
A   2   2   15
A   2   3   0
A   3   1   0
A   3   2   25
A   3   3   0
B   1   1   0
B   1   2   1
B   1   3   0
B   2   1   33
B   2   2   1
B   2   3   2
B   3   1   0
B   3   2   207
B   3   3   0
C   1   1   0
C   1   2   1
C   1   3   0
C   2   1   45
C   2   2   33
C   2   3   0
C   3   1   0
C   3   2   1
C   3   3   0'

df = read.table(text=txt, header=TRUE)

要构建随机生成的数据框,只需扩展四边形并通过lapply运行它:

max_quads <- 3
quads <- replicate(1000, sample(1:max_quads, 1))

df_list <- lapply(quads, function(q) {

  by_list <- by(df, df[c("S", "T")], FUN=function(df) df[sample(nrow(df), q),]))    
  sample_df <- do.call(rbind, by_list)

  sample_df <- with(sample_df, sample_df[order(S, T),])
  row.names(sample_df) <- NULL

  return(sample_df)

})