Как объединить информацию из двух строк с почти одинаковым именем - PullRequest
1 голос
/ 24 сентября 2019

У меня есть фрейм данных, который содержит много столбцов с почти одинаковыми именами, такими как A и A ... 1, B и B ... 1 и так далее.Я хотел бы объединить эти столбцы, такие как A и A ... 1, стать одним столбцом.Все эти столбцы содержат 0,1 или NA, NA: s следует рассматривать как нули (0).И так, если столбец A равен 0,0,1,1, NA и столбец A ... 1 равен 1,0,0,0,1 комбинированный_A должен быть = 1,0,1,1,1.Таким образом, если какой-либо из этих элементов столбца равен 1 в другом столбце, он должен быть одним в объединенном столбце.

Вот некоторый код для создания примера

original_table <- data.frame(A = c(0,0,1,1,NA),B = c(1,1,NA,NA,1),A...1 = c(1,0,0,0,1),B...1 = c(0,1,0,1,1))  

Итак, исходная таблица выглядит следующим образом

A  B  A...1  B...1
0  1  1      0
0  1  0      1
1  NA 0      0
1  NA 0      1
NA 1  1      1

Желаемая таблица вывода будет выглядеть так после объединения.

combined_table <- data.frame(combined_A = c(1,0,1,1,1),combined_B = c(1,1,0,1,1))  
combined_A combined_B
1          1
0          1
1          0
1          1
1          1

Я довольно хорошо знаком с R, но не смог найти помощи для этой проблемы.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Мы можем использовать split.default для разделения на основе общей части в именах столбцов.В этом примере кажется, что мы можем найти общие столбцы, извлекая первую букву из имени каждого столбца.

substr(names(original_table), 1, 1)
#[1] "A" "B" "A" "B"

Мы используем это для разделения столбцов и в каждой группе используем pmax, чтобы получить максимальное значение в каждой строке, удаляя NA

as.data.frame(lapply(split.default(original_table, 
        substr(names(original_table), 1, 1)), function(x) 
        do.call(pmax, c(x, na.rm = TRUE))))

#  A B
#1 1 1
#2 0 1
#3 1 0
#4 1 1
#5 1 1
0 голосов
/ 24 сентября 2019

Другое базовое решение: найдите нормальные имена столбцов:

initial_col <- str_extract(names(original_table),"[A-Z]")%>%
  unique()

> initial_col
[1] "A" "B"

, затем для всех столбцов, содержащих эти имена (grep(col,names(original_table),value = T)), составьте сумму строк и передайте ее в двоичный вывод

sapply(initial_col,function(col){
  tmp <- original_table[,grep(col,names(original_table),value = T)] %>%
    rowSums(.,na.rm = T,1) 
    ifelse( tmp  > 0,1,0)
})


     A B
[1,] 1 1
[2,] 0 1
[3,] 1 0
[4,] 1 1
[5,] 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...