显示随机样本而不从主数据框

时间:2018-01-19 09:55:20

标签: r dataframe subset sample

我有这个最终数据集,每40列约150 000行,涵盖了从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)中选择,例如通过在名为“selection”的列中随机分配值“1”。或者,如果不可能,我如何将采样行(此处称为“sc”)合并回主数据集,但显示已经采样的内容

注意:

过去两年我一直在零散地使用R而且我是一个相当缺乏经验的用户,所以如果这是一个愚蠢的问题我会道歉。我过去3天一直在谷歌和SO漫游,但还没有找到任何相关的答案。

我最近进入了生物学博士课程,要求我处理来自档案馆的大量数据。

1 个答案:

答案 0 :(得分:1)

  

编辑:根据评论更新。

您可以添加一列,指示行是否属于您的样本。所以也许尝试以下方法:

(array([-3., 1.91723747, 14.08276253]),


matrix(

       [[-0.57735027,  0.60061066, -0.55311256],

        [ 0.57735027, -0.1787042 , -0.79670037],

        [ 0.57735027,  0.77931486,  0.24358781]]))

输出:

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