显示随机样本而不从主数据帧中进行子集化

问题描述 投票:0回答:1

我有这个最终数据集,每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漫游,但还没有找到任何相关的答案。

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

r dataframe subset sample
1个回答
1
投票

编辑:根据评论更新。

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

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))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.