代码之家  ›  专栏  ›  技术社区  ›  C.Den

显示来自主数据帧的随机样本,无需子集设置

  •  0
  • C.Den  · 技术社区  · 8 年前

    我的最终数据集大约是每40列15万行,涵盖了1932年至2016年的所有潜在样本,我每年需要随机选择53个样本,总数约为5000个。

    选择本身非常简单,使用sample()函数来获取子集,但是我需要在原始数据帧中显示选择,以便能够检查各种内容。我的问题如下:

    如果我编辑随机子集中的一个字段并将其与主字段合并,则会创建无法删除的重复项,因为一个字段已更改,因此R认为这两行不重复。如果我不编辑任何内容,我就找不到选择了哪些行。

    我现在的解决方案是在Excel中合并所有内容,而不是R,应用颜色代码突出显示所选行,并手动删除重复项。然而,这很耗时,容易出错,而且不可行,因为数据集似乎太大,而且我的电脑在尝试时很快就会耗尽内存。。。

    更新:

    下面是一个可复制的示例:

    dat <- data.frame(
      X = sample(2000:2016, 50, replace=TRUE),
      Y = sample(c("yes", "no"), 50, replace = TRUE),
      Z = sample(c("french","german","english"), 50, replace=TRUE)
    )
    
    dat2 <- subset(dat, dat$X==2000)                   #samples of year 2000
    sc <- dat2[sample(nrow(dat2), 1), ]                #Random selection of 1
    

    我想做的是直接在数据集中进行选择(dat1),例如,在一个名为“选择”的列中随机分配值“1”。或者,如果不可能,我如何将采样的行(这里称为“sc”)合并回主数据集,但与指示它们已采样的内容合并

    注:

    在过去的两年里,我偶尔使用R,我是一个相当缺乏经验的用户,所以如果这是一个愚蠢的问题,我道歉。在过去的3天里,我一直在谷歌上漫游,所以找不到任何相关的答案。

    我最近参加了一个生物学博士课程,该课程要求我处理档案中的大量数据。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Florian    8 年前

    编辑:根据评论更新。

    您可以添加一列,指示行是否是示例的一部分。因此,不妨尝试以下方法:

    df = data.frame(year= c(1,1,1,1,1,1,2,2,2,2,2,2), id=c(1,2,3,4,5,6,7,8,9,10,11,12),age=c(7,7,7,12,12,12,7,7,7,12,12,12))
    
    library(dplyr)
    n_per_year_low_age = 2
    n_per_year_high_age = 1
    df <- df %>% group_by(year) %>% 
      mutate(in_sample1 = as.numeric(id %in% sample(id[age<8],n_per_year_low_age))) %>% 
      mutate(in_sample2 = as.numeric(id %in% sample(id[age>8],n_per_year_high_age))) %>%
      mutate(in_sample = in_sample1+in_sample2) %>%
      select(-in_sample1,-in_sample2)
    

    输出:

    # A tibble: 12 x 4
    # Groups: year [2]
        year    id   age in_sample
       <dbl> <dbl> <dbl>     <dbl>
     1  1.00  1.00  7.00      1.00
     2  1.00  2.00  7.00      1.00
     3  1.00  3.00  7.00      0   
     4  1.00  4.00 12.0       1.00
     5  1.00  5.00 12.0       0   
     6  1.00  6.00 12.0       0   
     7  2.00  7.00  7.00      1.00
     8  2.00  8.00  7.00      0   
     9  2.00  9.00  7.00      1.00
    10  2.00 10.0  12.0       0   
    11  2.00 11.0  12.0       0   
    12  2.00 12.0  12.0       1.00
    

    接下来的操作就很简单了:

    # extracting your sample
    df %>% filter(in_sample==1)
    # comparing statistics of your sample against the rest of the population
    df %>% group_by(year,in_sample) %>% summarize(mean(id))