我正在尝试使用从另一个数据帧中随机抽样的方式向另一个数据帧中重复添加列。
我的第一个dataframe包含要从其中采样的实际数据,如下所示
df <- data.frame(cat = c("a", "b", "c","a", "b", "c"),
x = c(6,23,675,1,78,543))我还有另一个这样的数据帧:
df2 <- data.frame(obs =c(1,2,3,4,5,6,7,8,9,10),
cat=c("a", "a", "a", "b", "b", "b", "c","c","c", "c"))我想向df2添加1000个新列,这些列从df中随机采样,按猫分组。我想出了一种(可能非常业余的)方法来实现这一点,即使用slice_sample()用df的随机样本生成一个新的数据帧sample1,然后将sample1与df2合并。
df <- df %>%
group_by(cat)
df2 <- df2 %>%
group_by(cat)
sample1 <- slice_sample(df, preserve = T, n=3, replace = T )
sample1 <- sample1 %>%
ungroup() %>%
mutate(obs=c(1:9)) %>%
select(-cat)
df3 <- merge(df2,sample1, by= "obs")现在,我想找到一种方法将这个过程重复1000次,最终得到包含1000列的df3 (x1、x2、x3等)。
我已经研究了重复循环,但还不能弄清楚如何让上面的代码在循环中工作。
发布于 2020-12-23 08:48:41
下面是一个可能有帮助的data.table选项
dt <- as.data.table(df)
dt2 <- as.data.table(df2)
n <- 1000
res <- cbind(
dt2[, .(obs)],
dt2[
,
replicate(n, sample(dt[.BY, x, on = "cat"], .N, replace = TRUE), simplify = FALSE),
cat
]
)发布于 2020-12-23 08:11:31
一种选择是创建一个函数,然后在执行连接之前使用replicate或rerun (来自purrr
library(dplyr)
library(purrr)
library(stringr)
f1 <- function(dat1) {
dat1 %>%
group_by(cat) %>%
slice_sample(n = 3, replace = TRUE) %>%
ungroup() %>%
mutate(obs = row_number()) %>%
select(-cat)
}
n <- 10
out <- rerun(10, f1(df)) %>%
c(list(df2), .) %>%
reduce(inner_join, by = 'obs') %>%
rename_at(vars(starts_with('x')), ~ str_c('x', seq_along(.))) 发布于 2020-12-23 10:21:56
在df2中只能保留3 X数量的唯一cat值行。使用replicate重复采样过程n次,并添加n新列。
library(dplyr)
n <- 10
df2 <- df2 %>% slice(1:(3*n_distinct(cat)))
df2[paste0('x', 1:n)] <- replicate(n, df %>%
group_by(cat) %>%
slice_sample(n = 3, replace = TRUE) %>%
pull(x))
# obs cat x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
#1 1 a 6 1 1 6 6 1 1 1 6 6
#2 2 a 6 1 1 1 1 6 1 1 1 1
#3 3 a 1 6 1 6 1 6 6 1 6 6
#4 4 b 78 78 78 23 78 78 78 78 23 23
#5 5 b 78 78 78 23 23 23 78 78 78 23
#6 6 b 78 78 23 78 78 78 23 23 78 23
#7 7 c 675 543 543 543 543 543 675 543 543 675
#8 8 c 543 543 675 675 675 675 675 543 675 543
#9 9 c 543 543 675 543 675 543 675 675 543 675https://stackoverflow.com/questions/65417375
复制相似问题