首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用从随机抽样的另一个数据帧中创建的重复列来创建数据帧?

如何使用从随机抽样的另一个数据帧中创建的重复列来创建数据帧?
EN

Stack Overflow用户
提问于 2020-12-23 07:56:05
回答 3查看 41关注 0票数 0

我正在尝试使用从另一个数据帧中随机抽样的方式向另一个数据帧中重复添加列。

我的第一个dataframe包含要从其中采样的实际数据,如下所示

代码语言:javascript
复制
df <- data.frame(cat = c("a", "b", "c","a", "b", "c"),
                 x = c(6,23,675,1,78,543))

我还有另一个这样的数据帧:

代码语言:javascript
复制
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合并。

代码语言:javascript
复制
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等)。

我已经研究了重复循环,但还不能弄清楚如何让上面的代码在循环中工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-23 08:48:41

下面是一个可能有帮助的data.table选项

代码语言:javascript
复制
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
  ]
)
票数 2
EN

Stack Overflow用户

发布于 2020-12-23 08:11:31

一种选择是创建一个函数,然后在执行连接之前使用replicatererun (来自purrr

代码语言:javascript
复制
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(.)))  
票数 1
EN

Stack Overflow用户

发布于 2020-12-23 10:21:56

df2中只能保留3 X数量的唯一cat值行。使用replicate重复采样过程n次,并添加n新列。

代码语言:javascript
复制
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 675
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65417375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档