Складывайте отдельные столбцы с одинаковым идентификатором R

#r #dplyr

Вопрос:

Можно ли объединить столбцы с одинаковым идентификатором и сложить их друг на друга из одного и того же фрейма данных. Также для того, чтобы затем удалить значения NA, как показано в выводе желаемого кадра данных?

Текущий кадр данных

 id Col1 Col2 Col3  1 A NA C  1 NA B NA  2 NA B NA  2 A NA C  3 A NA C   

Желаемый кадр данных

 id NewCol  1 A  1 B  1 C  2 A  2 B 2 C 3 A 3 C  

Ответ №1:

Измените форму с «широкой» на «длинную» pivot_longer , удалив NA букву «с values_drop_na «, а затем выполните arrange операцию на всех столбцах

 library(tidyr) library(dplyr) pivot_longer(df1, cols = starts_with('Col'), values_to = 'NewCol',   names_to = NULL, values_drop_na = TRUE) %gt;%  arrange(across(everything()))  

-выход

 # A tibble: 8 × 2  id NewCol  lt;intgt; lt;chrgt;  1 1 A  2 1 B  3 1 C  4 2 A  5 2 B  6 2 C  7 3 A  8 3 C   

данные

 df1 lt;- structure(list(id = c(1L, 1L, 2L, 2L, 3L), Col1 = c("A", NA,  NA, "A", "A"), Col2 = c(NA, "B", "B", NA, NA), Col3 = c("C",  NA, NA, "C", "C")), class = "data.frame", row.names = c(NA, -5L ))  

Комментарии:

1. Это было быстро! Мне было интересно, например, есть ли у них разные имена столбцов?

2. @machine_apprentice, тогда вы можете использовать cols = -id

3. или по тому индексу, в который я тоже верю, собираюсь попробовать это сейчас 😀

4. @machine_apprentice вы также можете использовать cols = 2:4

5. @machine_apprentice с pivot_longer , типы должны быть одинаковыми, иначе придется изменить его на общий тип перед применением pivot_longer , т. е. df1 %gt;% mutate(across(2:4, ~ as.character(.)) %gt;% pivot_longer(..

Ответ №2:

В качестве альтернативы мы могли бы использовать splitshakeshape packackge:

 library(splitstackshape) library(dplyr)  df %gt;%   merged.stack(df, id.vars="id",   var.stubs="Col", sep = ".") %gt;%   na.omit() %gt;%   select(-.time_1)  
 id Col 1: 1 A 2: 1 B 3: 1 C 4: 2 A 5: 2 B 6: 2 C 7: 3 A 8: 3 C