我有一个
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
列,该列的某些值带有分号,表示它组合了多个
身份证件
s、 它们在其余列中的值是共享的。
对于id带有分号的每一行:
-
我想分两份
身份证件
用分号分隔符
-
数据帧
按
身份证件
-
随机
shuffle
复制的顺序
数据帧
-
替换中的原始行
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
或
data.table