Для каждого столбца в data.frame найдите строки, в которых столбец является единственным, имеющим положительное значение - PullRequest
0 голосов
/ 21 января 2019

Мне нужно знать, какие элементы строки уникальны для каждого столбца в data.frame, а затем печатать имена строк в выходных данных.

Пример моих данных:

id  A   B   C
s1  1   2   1
s2  1   0   0
s3  0   12  3
s4  0   1   0
s5  0   1   0

Я бы хотел получить что-то вроде этого:

$A s2
$B s4,s5
$C NA 

Что означает, что:

A имеет только один уникальный элемент - s2

B имеет два уникальных элемента - s4 и s5

и C не имеет уникальных элементов, поэтому он заполнен NA

Я пробовал

apply(data, 2, function(x) unique(x))

но это не то, что мне нужно ..

Большое спасибо за предложения!

1 Ответ

0 голосов
/ 21 января 2019

Вот примерное решение R:

helper <- function(x) {
  has_p <- x > 0
  if (sum(has_p) != 1) has_p[] <- FALSE 
  has_p
}
step1 <- as.data.frame(t(apply(df[-1], 1, helper)))

lapply(step1, function(x) df[[1]][x])

$A
[1] "s2"

$B
[1] "s4" "s5"

$C
character(0)

Редактировать

Вот гораздо более простая логика для того же решения:

rows <- rowSums(df[-1] > 0) == 1
lapply(df[-1], function(x) df[["id"]][rows & x > 0])

Редактировать 2

Поместить в один шаг (и добавить правильный вывод NA, когда ничего уникального):

lapply(
  as.data.frame(df[-1] > 0 & rowSums(df[-1] > 0) == 1),
  function(x) {
    if (all(!x)) return(NA)
    df[["id"]][x]
  }
)

Данные

df <- structure(list(id = c("s1", "s2", "s3", "s4", "s5"), A = c(1L, 
1L, 0L, 0L, 0L), B = c(2L, 0L, 12L, 1L, 1L), C = c(1L, 0L, 3L, 
0L, 0L)), row.names = c(NA, -5L), class = "data.frame")
...