Создайте двоичные столбцы в группах — используя R

#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