拆分data.frame行并调整其顺序

时间:2019-01-31 07:17:07

标签: r dataframe split shuffle

我有一个public,例如:

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,并且它们在其余各列中的值都被共享。

对于ID为分号的每一行:

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

这是我的繁琐尝试:

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]) } tidyverse)和更快的东西。

1 个答案:

答案 0 :(得分:2)

我们可以使用separate_rows,然后按sample中的row_number()和'{val1'}分组。

slice