#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