Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新对可变长度的组进行采样,使组长度相等(R,dplyr)_R_Dplyr - Fatal编程技术网

重新对可变长度的组进行采样,使组长度相等(R,dplyr)

重新对可变长度的组进行采样,使组长度相等(R,dplyr),r,dplyr,R,Dplyr,我有一个数据集,其中组之间的行数可以不同。我需要在每个组中随机抽样替换,以便行数等于预定值 下面是一个示例数据和所需的结果表格。在本例中,我需要随机抽取每个组的样本,以便每个站点有4行。此外,由于SITE$A已经有4行,因此不应对其重新采样 请注意,RESULT表如何在STUFF:STUFF3的列中保留数据顺序。我更喜欢使用dplyr,因为我广泛使用这个软件包,但我对其他解决方案持开放态度 NUMBER = 4 DATA = data.frame(SITE = c("A","A",

我有一个数据集,其中组之间的行数可以不同。我需要在每个组中随机抽样替换,以便行数等于预定值

下面是一个示例
数据
和所需的
结果
表格。在本例中,我需要随机抽取每个组的样本,以便每个
站点
有4行。此外,由于
SITE$A
已经有4行,因此不应对其重新采样

请注意,
RESULT
表如何在
STUFF:STUFF3
的列中保留数据顺序。我更喜欢使用
dplyr
,因为我广泛使用这个软件包,但我对其他解决方案持开放态度

  NUMBER = 4

    DATA = data.frame(SITE = c("A","A","A","A","B","B","B","C","C"),  
                      STUFF = c(1, 2, 30, 40, 100, 200, 300, 5000, 6000),
                      STUFF2 = c(2, 4, 60, 80, 200, 400, 600, 10000, 12000),
                      STUFF3 = c(4, 8, 120, 160, 400, 800, 1200, 20000, 24000))



   RESULT = data.frame(SITE = c("B","C","C"), 
                    STUFF = c(200, 5000, 5000),
                    STUFF2 = c(400, 10000, 10000),
                    STUFF3 = c(800, 20000, 20000))
我尝试了下面代码的各种迭代……但没有成功。提前谢谢

RESULT = group_by(DATA, SITE)%>%
  sample_n(NUMBER - length(.), replace = TRUE)

如果我正确理解了这个问题,
RESULT
数据
的一种补充数据框,例如,当它们组合在一起时,每组将产生4行

NUMBER <- 4

set.seed(1234)

RESULT2 <- DATA %>%
  group_by(SITE) %>%
  mutate(n = n(),
         sampsize = as.numeric( ifelse(n>=NUMBER,0,NUMBER-n)) ) %>%
  do( sample_n(., size=.$sampsize[1], replace=TRUE ) ) %>%
  select( -n, -sampsize ) %>%
  ungroup()

RESULT2
如果需要完整的数据集(将
数据
结果
组合成一个具有特定排序要求的数据帧),则可以使用以下数据集:

NUMBER <- 4

set.seed(1234)

RESULT3 <- DATA %>%
  group_by(SITE) %>%
  mutate(n = n(),
         sampsize = as.numeric( ifelse(n>=NUMBER,0,NUMBER-n)) ) %>%
  do( rbind(.,sample_n(., size=.$sampsize[1], replace=TRUE )) ) %>%
  select( -n, -sampsize ) %>%
  ungroup()

RESULT3

请注意,如果
NUMBER
小于组中的记录数,则
RESULT3
将显示未修改的整个组

这里是@akhmed代码的一个版本,它结合了
mutate
语句。我必须更好地使用
dplyr
中的
do
功能。谢谢

RESULT4 <- group_by(DATA, SITE) %>%
      mutate(sampsize = NUMBER - n())%>%
      do (sample_n(., size = .$sampsize[1], replace=TRUE )) %>%
      select(-sampsize ) %>%
      ungroup()
RESULT4%
变异(sampsize=NUMBER-n())%>%
do(样本编号(,大小=.$sampsize[1],替换=真))%>%
选择(-sampsize)%>%
解组()

分组依据(数据,站点)%%>%sample\n(4,replace=TRUE)
您的代码重新采样了
站点$A
,不应该重新采样。啊,我明白了。如果要保留所有现有数据,
sample\n
可能是一个错误的选择。可能是,但“sample”也不起作用。主要问题似乎是将组的可变长度合并到
sample\n
size
参数中(例如,
SITE$A
为0,
SITE$B
为1,
SITE$C
为2),它总是归结为
do
函数!!!谢谢我写了一些与你的代码非常相似的代码,但是我没有加入
do
函数。我还稍微修改了您的代码,将
sampsize
计算包装到一行中,而不使用
ifelse
语句。再次感谢。
Source: local data frame [12 x 4]

   SITE STUFF STUFF2 STUFF3
1     A     1      2      4
2     A     2      4      8
3     A    30     60    120
4     A    40     80    160
5     B   100    200    400
6     B   200    400    800
7     B   300    600   1200
8     B   100    200    400
9     C  5000  10000  20000
10    C  6000  12000  24000
11    C  6000  12000  24000
12    C  6000  12000  24000
RESULT4 <- group_by(DATA, SITE) %>%
      mutate(sampsize = NUMBER - n())%>%
      do (sample_n(., size = .$sampsize[1], replace=TRUE )) %>%
      select(-sampsize ) %>%
      ungroup()