Продолжение: разделите столбцы с постоянными числами и сведите их в одну строку в R data.frame - PullRequest
1 голос
/ 09 октября 2019

Этот вопрос является продолжением моего предыдущего вопроса . В этом вопросе после моего split.default() звонка ниже я получаю с именем list data.frames, который называется L.

Qs: Мне было интересно, как я могу сжать каждый data.frame в L, каждый столбец которого состоит из постоянного числа? (Как насчет того, если я знаю имена 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

1 Ответ

1 голос
/ 09 октября 2019

Предполагая, что строки NA должны быть сохранены, примените duplicated, повторяя цикл над list, а также, если все элементы конкретного * 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...