【问题标题】:how to create a list from a dataframe using conditions如何使用条件从数据框创建列表
【发布时间】:2018-07-10 03:18:19
【问题描述】:
R:
    X       Y       Z       L
                .
                .
                .
    a       2       8       0
    b       3       2       0
    c       12      5       0 
    d       3       22      0
    e       4       33      0
    f       2       1       1
    g       3       4       0
    h       1       2       0
    i       2       5       0 
    j       7       4       0
    k       3       3       1
    ...

如果 N 是 L > 0 的次数,我如何创建一个包含 N 个对象的 list() 以这种方式组成:

如果 i 是 L>0 的行,则第一个对象将在数据帧 R 中的 i-3 和 i 中具有行,并且对于 L>0 的所有 i 行,如下所示:

list()
[1]
    d       3       22      0
    e       4       33      0
    f       2       1       1
[2]
    i       2       5       0 
    j       7       4       0
    k       3       3       1

【问题讨论】:

    标签: r list dataframe conditional-statements


    【解决方案1】:

    我认为这会起作用,除了数据集的前两行:

    df<-data.frame(X=letters, Y=rnorm(26,0,1),L=rbinom(26,1,0.5))
    df
    
    
    List<-list()
    for (i in 3:length(df$X)) {
      if (df$L[i] == 1) {
        a <- df[(i-2):i,]
      } else { a<-NULL 
        }
    
      List[[length(List)+1]] = a
    
    }
    
    
    List
    

    【讨论】:

      【解决方案2】:

      没有for循环的解决方案。

      第 1 步:将i 设置为 3

      第 2 步:对数据框 dat 进行子集化以拥有正确的行

      第三步:根据行数和i创建分组变量Group

      第四步:根据Group拆分数据框

      第 5 步:删除每个子集的 Group

      i <- 3    
      dat2 <- dat[as.vector(sapply(which(dat$L == 1), function(x) x + seq(-i + 1, 0))), ]
      dat2$Group <- rep(1:(nrow(dat2)/i), each = i)
      dat_list <- split(dat2, dat2$Group)
      dat_list <- lapply(dat_list, function(x){
        x$Group <- NULL
        return(x)})
      

      这是结果

      dat_list
      # $`1`
      #   X Y  Z L
      # 4 d 3 22 0
      # 5 e 4 33 0
      # 6 f 2  1 1
      # 
      # $`2`
      #    X Y Z L
      # 9  i 2 5 0
      # 10 j 7 4 0
      # 11 k 3 3 1
      

      数据

      dat <- read.table(text = "    X       Y       Z       L
          a       2       8       0
          b       3       2       0
          c       12      5       0 
          d       3       22      0
          e       4       33      0
          f       2       1       1
          g       3       4       0
          h       1       2       0
          i       2       5       0 
          j       7       4       0
          k       3       3       1", 
                        header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,并且 R 不能执行 L[5] = 1 和 L[6] = 1 之类的操作,那么:

        ind = which(R[, "L"] > 0)
        res = vector(mode = "list", length = length(ind))
        for (iind in seq_along(ind)) {
           res[[iind]] = R[(ind[iind]-2):ind[iind],]
        }
        

        我减去了i-2,因为您的输出有 3 行。如果R 是矩阵,则列表res 中的结果将是矩阵。如果需要,您可以将 as.data.frame() 包裹在该子集操作周围以获得 data.frames。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-18
          • 1970-01-01
          • 2019-11-09
          • 1970-01-01
          • 2022-11-28
          • 1970-01-01
          • 2020-07-31
          相关资源
          最近更新 更多