【发布时间】: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 的每一行:
- 我想用分号分隔符分割
id - 将
data.frame行复制为已拆分的ids 的数量 - 随机
shuffle复制data.frame的顺序 - 将
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])
}
所以我正在寻找更优雅(可能使用tidyverse 或data.table)和更快的东西。
【问题讨论】: