Разделение значений на основе дубликатов в строке на новые столбцы в R - PullRequest
1 голос
/ 18 октября 2019

У меня есть следующий пример фрейма данных:

  first         second       third
 ----------------------------------
  A             1            A1
  A             2            A2
  A             3            A2
  B             1            B1
  C             1            C1
  C             2            C2

Есть ли способ разбить второй столбец и третий столбец на новый столбец на основе дублированных значений / строк в первом столбце? Как это:

  first         second       second.2      second.3    third   third.2     third.3
  A             1            2             3           A1      A2          A2
  B             1            NA            NA          B1      NA          NA
  C             1            2             NA          C1      C2          NA

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы также можете использовать data.table::dcast для преобразования в широкий формат. Правая часть ~ здесь похожа на аргумент names_from для pivot_wider, а value.var похожа на аргумент values_from. Таким образом, столбцы будут [value.var name] .rowid (first), где rowid(first) создает номера строк внутри группы, где группа определяется значением first.

library(data.table)
setDT(df)

dcast(df, first ~ rowid(first), value.var = c('second', 'third'), sep = '.')

#    first second.1 second.2 second.3 third.1 third.2 third.3
# 1:     A        1        2        3      A1      A2      A2
# 2:     B        1       NA       NA      B1    <NA>    <NA>
# 3:     C        1        2       NA      C1      C2    <NA>
2 голосов
/ 18 октября 2019

Опция pivot_wider. Здесь «второй» столбец также является столбцом последовательности для каждой группы «первого». Итак, продублируйте этот столбец с mutate, а затем используйте pivot_wider для изменения формы с «длинного» на «широкий»

library(dplyr)
library(tidyr)
df1 %>%
   mutate(rn = second) %>% 
   pivot_wider(names_from  = rn, values_from = c(second, third), names_sep = ".")
# A tibble: 3 x 7
#  first second.1 second.2 second.3 third.1 third.2 third.3
#  <chr>    <int>    <int>    <int> <chr>   <chr>   <chr>  
#1 A            1        2        3 A1      A2      A2     
#2 B            1       NA       NA B1      <NA>    <NA>   
#3 C            1        2       NA C1      C2      <NA>   

данные

df1 <- structure(list(first = c("A", "A", "A", "B", "C", "C"), second = c(1L, 
2L, 3L, 1L, 1L, 2L), third = c("A1", "A2", "A2", "B1", "C1", 
"C2")), class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...