#r
Вопрос:
У меня есть двоичные файлы, и я хотел бы сгруппировать их по парам.
A B C
1 0 0
0 1 1
0 1 1
1 1 0
хотеть
A B C group
1 0 1 AC
0 1 1 BC
0 1 1 BC
1 1 0 AB
Ответ №1:
Вы можете использовать apply
в базе R и вставить имена столбцов, где значение в строке равно 1.
cols <- names(df)
df$group <- apply(df, 1, function(x) paste0(cols[x == 1], collapse = ''))
df
# A B C group
#1 1 0 1 AC
#2 0 1 1 BC
#3 0 1 1 BC
#4 1 1 0 AB
С dplyr
:
library(dplyr)
df %>%
rowwise() %>%
mutate(group = paste0(cols[c_across() == 1], collapse = '')) %>%
ungroup
данные
df <- structure(list(A = c(1L, 0L, 0L, 1L), B = c(0L, 1L, 1L, 1L),
C = c(1L, 1L, 1L, 0L)), row.names = c(NA, -4L), class = "data.frame")
Ответ №2:
Операции, выполняемые над строками, могут быть более эффективными с dapply
помощью from collapse
library(collapse)
df$group <- dapply(df, FUN = function(x)
paste(names(df)[as.logical(x)], collapse=""), MARGIN = 1)
df$group
#[1] "AC" "BC" "BC" "AB"
Или другой вариант- unite
после изменения элементов на имена столбцов
library(dplyr)
library(tidyr)
df %>%
mutate(across(everything(), ~case_when(as.logical(.) ~
cur_column(), TRUE ~ ''))) %>%
unite(group, !!! names(.), sep="") %>%
bind_cols(df, .)
# A B C group
#1 1 0 1 AC
#2 0 1 1 BC
#3 0 1 1 BC
#4 1 1 0 AB
данные
df <- structure(list(A = c(1L, 0L, 0L, 1L), B = c(0L, 1L, 1L, 1L),
C = c(1L, 1L, 1L, 0L)), row.names = c(NA, -4L), class = "data.frame")
Ответ №3:
Вот базовый вариант R
df$group <- sapply(Map(subset, list(names(df)), as.data.frame(t(df) > 0)), paste0, collapse = "")
дающий
> df
A B C group
1 1 0 1 AC
2 0 1 1 BC
3 0 1 1 BC
4 1 1 0 AB