【问题标题】:Reduce number of columns with priority for certain values减少具有某些值优先级的列数
【发布时间】:2022-11-21 22:31:15
【问题描述】:

我想折叠一个 < 100 列四倍的数据框, 由此代码将迭代 4 个相邻列的组并将它们合并为一个。 但是,基于每组 4 个的结果值取决于值的优先级。

例如,最高优先级为“1”,因此只要 4 列中的任何一列对该行的值为“1”,它就应该是结果值。第二个优先级为 0,如果集合中有一个 '0' 和三个 NA,则结果应该为 '0'(只要没有 '1')。最低优先级是 NA,只有完全由 NA 组成的集合才会保持 NA。下面是一个示例,下面是可重现的代码。

  ID c1 c2 c3 c4 c5 c6 c7 c8
row1  1  0  0  0  1  0  0 NA
row2 NA NA NA  0 NA NA NA NA

成为

  ID c1 c2
row1  1  1
row2  0 NA
structure(list(ID = c("row1", "row2"), c1 = c(1, NA), c2 = c(0, 
NA), c3 = c(0, NA), c4 = c(0, 0), c5 = c(1, NA), c6 = c(0, NA
), c7 = c(0, NA), c8 = c(NA, NA)), class = "data.frame", row.names = c(NA, 
-2L))

【问题讨论】:

    标签: r dataframe merge concatenation


    【解决方案1】:

    这个怎么样:

    dat <- structure(list(ID = c("row1", "row2"), c1 = c(1, NA), c2 = c(0, 
                                                                 NA), c3 = c(0, NA), c4 = c(0, 0), c5 = c(1, NA), c6 = c(0, NA
                                                                 ), c7 = c(0, NA), c8 = c(NA, NA)), class = "data.frame", row.names = c(NA, 
                                                                                                                                        -2L))
    
    out <- data.frame(ID = dat$ID)
    k <- 2 # first column to start
    i <- 1 # first variable name
    while(k < ncol(dat)){
      out[[paste0("c", i)]] <- apply(dat[,k:(k+3)], 1, max, na.rm=TRUE)
      out[[paste0("c", i)]] <- ifelse(is.finite(out[[paste0("c", i)]]), out[[paste0("c", i)]], NA)
      k <- k+4
      i <- i+1
    }
    #> Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
    out
    #>     ID c1 c2
    #> 1 row1  1  1
    #> 2 row2  0 NA
    

    reprex package (v2.0.1) 创建于 2022-11-21

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多