Вот примерное решение 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")