我有这个最终数据集,每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漫游,但还没有找到任何相关的答案。
我最近进入了生物学博士课程,要求我处理来自档案馆的大量数据。
答案 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