我有一个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为分号的每一行:
id
id
行复制为已拆分的data.frame
个数id
复制的shuffle
的顺序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
)和更快的东西。
答案 0 :(得分:2)
我们可以使用separate_rows
,然后按sample
中的row_number()
和'{val1'}分组。
slice