【问题标题】:Follow-up: Separate columns with constant numbers and condense them to one row in R data.frame后续:用常数分隔列并在R data.frame中将它们压缩为一行
【发布时间】:2020-02-07 05:44:21
【问题描述】:

这个问题是my previous question 的后续问题。在这个问题中,在我下面的split.default() 调用之后,我得到了一个名为L 的data.frames 的命名 list

问:我想知道如何压缩L 中的每个data.frame,其每一列都由一个常数组成? (如果我知道列是常数的data.frames的名称呢?)

我想要的输出如下所示。

r <- list(
   data.frame(study.name = rep("Jacob", 6), 
         X = c(2,2,1,1,NA, NA), 
         Y = c(1,1,1,2,1,NA), 
         A = rep(1, 6),
         B = rep(4, 6)), 

   data.frame(study.name = rep("Jon", 6), 
         X = c(1,NA,3,1,NA,NA), 
         G = c(1,1,1,2,NA,NA),
         A = rep(3, 6),
         B = rep(7, 6)))

DATA <- do.call(cbind, r)

nm1 <- Reduce(intersect, lapply(r, colnames))[-1] 
L <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])

期望的输出:

    # $A
    #   A A.1
    # 1 1   3

    # $B
    #   B B.1
    # 1 4   7

    # $X
    #    X X.1
    # 1  2   1
    # 2  2  NA
    # 3  1   3
    # 4  1   1
    # 5 NA  NA
    # 6 NA  NA

【问题讨论】:

    标签: r list function loops dataframe


    【解决方案1】:

    假设应该保留NA 行,通过循环list 来应用duplicated,并且如果特定的所有元素都是NA,则保留该行

    lapply(L, function(x)  x[(rowSums(is.na(x)) == ncol(x))|!duplicated(x),])
    #$A
    #  A A.1
    #1 1   3
    
    #$B
    #  B B.1
    #1 4   7
    
    #$X
    #   X X.1
    #1  2   1
    #2  2  NA
    #3  1   3
    #4  1   1
    #5 NA  NA
    #6 NA  NA
    

    如果我们还需要检查常量值

    is_constant <- function(x) length(unique(x)) == 1L
    lapply(L, function(x) if(all(sapply(x, is_constant))) x[1,, drop = FALSE] else x)
    #$A
    #  A A.1
    #1 1   3
    
    #$B
    #  B B.1
    #1 4   7
    
    #$X
    #   X X.1
    #1  2   1
    #2  2  NA
    #3  1   3
    #4  1   1
    #5 NA  NA
    #6 NA  NA
    

    【讨论】:

    • 嗨 Arun,HERE 是我容易理解的问题吗?
    猜你喜欢
    • 2020-02-07
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2020-01-02
    • 2015-04-27
    • 2021-10-18
    相关资源
    最近更新 更多