【问题标题】:Split data.frame rows and shuffle their order拆分 data.frame 行并打乱它们的顺序
【发布时间】:2019-01-31 07:17:06
【问题描述】:

我有一个data.frame,例如:

set.seed(1)
df <- data.frame(id = c("A","B;C","D","E","F;G;H","I"), val1 = rnorm(6), val2 = letters[1:6], stringsAsFactors=F)

有一个id 列,它的一些值有一个分号表示它结合了几个ids,并且它们在其余列中的值是共享的。

对于带有分号的 id 的每一行:

  1. 我想用分号分隔符分割id
  2. data.frame 行复制为已拆分的 ids 的数量
  3. 随机shuffle复制data.frame的顺序
  4. df中的原始行替换为我在3中创建的行,这样df中所有其他行的顺序不变。

这是我繁琐的尝试:

idx <- which(grepl(";",df$id))
l <- lapply(idx, function(i){
  ids <- strsplit(df$id[i], split = ";")[[1]]
  df.i <- do.call("rbind", replicate(length(ids), df[i,,drop=F], simplify = FALSE))
  df.i$id <- ids[permute::shuffle(ids)]
  return(df.i)
})

idx.names <- df$id[idx]

for(i in 1:length(idx.names)){
  df <- rbind(df[1:(which(df$id == idx.names[i])-1),,drop=F],
              l[[i]],
              df[(which(df$id == idx.names[i])+1):nrow(df),,drop=F])
}

所以我正在寻找更优雅(可能使用tidyversedata.table)和更快的东西。

【问题讨论】:

    标签: r dataframe split shuffle


    【解决方案1】:

    我们可以使用separate_rows,然后在slice中按'val2'、samplerow_number()分组

    library(tidyverse)
    df %>% 
       separate_rows(id) %>%
       group_by(val2) %>%
       slice(sample(row_number()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多