代码之家  ›  专栏  ›  技术社区  ›  dan

拆分data.frame行并无序排列它们的顺序

  •  2
  • dan  · 技术社区  · 7 年前

    我有一个 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带有分号的每一行:

    1. 我想分两份 身份证件 用分号分隔符
    2. 数据帧 身份证件
    3. 随机 shuffle 复制的顺序 数据帧
    4. 替换中的原始行 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

    1 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    我们可以使用 separate_rows ,然后按“val2”分组, sample row_number() 在里面 slice

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