Объединить несколько копий переменной в одну переменную с большим набором данных в R - PullRequest
0 голосов
/ 19 марта 2020

У меня есть набор данных, который имеет несколько версий каждой переменной. Все переменные оканчиваются на _1, _2, _3. Я хотел бы объединить различные версии переменной в один новый столбец. У меня очень большой набор данных, поэтому я хотел бы попытаться избежать ручного кодирования каждой переменной (например, dat $ test <- paste (dat $ test_1, dat $ test_2, dat $ test_3)), потому что это займет некоторое время. Мой набор данных выглядит следующим образом: </p>

test_1  test_2  test_3  type_1  type_2  type_3  other_1  other_2  other_3
a        f        f        d     s        t       j         y      b  
s        d        c        v     s        y       h         a      m 
d        s        v        d     h        u       n         j      k  

Я хотел бы, чтобы переменные были представлены в одном столбце, например:

   test    type    other
    aff     dst     jyb
    sdc     vsy     ham
    dsv     dhu     njk

Я не знаком с циклами, но думал, что это будет что-то с использованием grep () для поиска имени переменной и последующего объединения последующих версий в новый столбец? У кого-нибудь есть предложения по go по этому поводу? Любая помощь приветствуется!

1 Ответ

0 голосов
/ 19 марта 2020

Мы можем использовать melt из data.table и paste элементов вместе

library(data.table)
melt(setDT(df1, keep.rownames = TRUE), measure  =
      patterns('^test', 'type', 'other'),
    value.name = c('test', 'type', 'other'))[, 
       variable := NULL][, lapply(.SD, paste, collapse=""),
      .(rn)][, rn := NULL][]
#    test type other
#1:  aff  dst   jyb
#2:  sdc  vsy   ham
#3:  dsv  dhu   njk

Или с помощью аналогичного метода в tidyverse

library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
   mutate(rn = row_number()) %>%
   pivot_longer(cols = -rn,  names_to = c( ".value", 'grp'), names_sep="_") %>% 
   group_by(rn) %>%
   summarise_at(vars(test:other), str_c, collapse ="") %>%
   select(-rn)
# A tibble: 3 x 3
#  test  type  other
#  <chr> <chr> <chr>
#1 aff   dst   jyb  
#2 sdc   vsy   ham  
#3 dsv   dhu   njk  

data

df1 <- structure(list(test_1 = c("a", "s", "d"), test_2 = c("f", "d", 
"s"), test_3 = c("f", "c", "v"), type_1 = c("d", "v", "d"), type_2 = c("s", 
"s", "h"), type_3 = c("t", "y", "u"), other_1 = c("j", "h", "n"
), other_2 = c("y", "a", "j"), other_3 = c("b", "m", "k")),
   class = "data.frame", row.names = c(NA, 
-3L))
...