Как объединить строки в R - PullRequest
0 голосов
/ 31 января 2020

У меня есть большой набор данных, который выглядит примерно так

ID | X2 | X3 | X4|
1  | abc| abc| abc|
1  | xyz| xyz| xyz|
2  | abc| abc| abc|

, и я хочу объединить строки по номеру идентификатора (как если бы вы использовали слияние, если бы они были разными фреймами данных), чтобы выглядеть как это:

ID | X1 | X2 | X3| X1.b| X2.b|X3.b|
1  | abc| abc| abc| xyz| xyz| xyz|
2  | abc| abc| abc| NA | NA | NA |

Я пробовал функцию изменения формы, но способ, которым она работает с timevar, не очень хорошо вписывается в мои данные (я думаю?)

Я был бы благодарен услышать чужие идеи!

Ответы [ 2 ]

1 голос
/ 31 января 2020

Мы можем сделать pivot_wider непосредственно для нескольких столбцов после создания столбца последовательности по идентификатору

library(dplyr)
library(tidyr)
df1 %>% 
   group_by(ID) %>%
   mutate(rn = row_number()) %>%
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = c(X2, X3, X4), names_sep=".")
# A tibble: 2 x 7
#     ID X2.1  X2.2  X3.1  X3.2  X4.1  X4.2 
#  <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 abc   xyz   abc   xyz   abc   xyz  
#2     2 abc   <NA>  abc   <NA>  abc   <NA> 

или с использованием data.table

library(data.table)
dcast(setDT(df1), ID ~ rowid(ID), value.var = c("X2", "X3", "X4"), sep=".")
#   ID X2.1 X2.2 X3.1 X3.2 X4.1 X4.2
#1:  1  abc  xyz  abc  xyz  abc  xyz
#2:  2  abc <NA>  abc <NA>  abc <NA>

данных

df1 <- structure(list(ID = c(1, 1, 2), X2 = c("abc", "xyz", "abc"), 
    X3 = c("abc", "xyz", "abc"), X4 = c("abc", "xyz", "abc")), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 31 января 2020

Используя dplyr и tidyr, мы можем получить данные в длинном формате, создать уникальное значение для каждых ID и name и снова получить данные в широком формате.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -ID) %>%
  group_by(ID, name) %>%
  mutate(row = paste0(name, letters[row_number()])) %>%
  ungroup() %>%
  select(-name) %>%
  pivot_wider(names_from = row, values_from = value)

# A tibble: 2 x 7
#     ID X2a   X3a   X4a   X2b   X3b   X4b  
#  <int> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 abc   abc   abc   xyz   xyz   xyz  
#2     2 abc   abc   abc   NA    NA    NA   

данные

df <- structure(list(ID = c(1L, 1L, 2L), X2 = c("abc", "xyz", "abc"
), X3 = c("abc", "xyz", "abc"), X4 = c("abc", "xyz", "abc")), row.names = c(NA, 
-3L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...