Объедините несколько столбцов в один столбец списка

#r #data.table

Вопрос:

Я хотел бы объединить несколько столбцов в один столбец списка в таблице data.table в примере R.:

 require(data.table)

dt = data.table(col1 = LETTERS[1:5],
                col2 = rep('test', 5),
                col3 = c('hello', 'yes', 'no', 'maybe', 'why'))
 

Вопрос: Как я могу объединить col2 и col3 в столбец списка?

То, что я пробовал до сих пор:

 cols = c('col2', 'col3')
dt[ , col4 := paste0(.SD, collapse = ', '), .SDcols = cols,
    by = 1:nrow(dt) ] # paste's them together
dt[ , col4 := c(.SD), .SDcols = cols,
    by = 1:nrow(dt) ] # drops col3
dt[ , col4 := lapply(.SD, c), .SDcols = cols,
    by = 1:nrow(dt) ] # drops col3
 

Ответ №1:

Вы можете использовать data.table transpose эту функцию.

 library(data.table)
cols = c('col2', 'col3')

dt[ , col4 := lapply(transpose(.SD), c), .SDcols = cols] 
dt
#   col1 col2  col3       col4
#1:    A test hello test,hello
#2:    B test   yes   test,yes
#3:    C test    no    test,no
#4:    D test maybe test,maybe
#5:    E test   why   test,why

class(dt$col4)
#[1] "list"
 

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

1. Могу я попросить .SD вас об этом?

2. .SD представляет подмножество данных. Он состоит из столбцов, указанных в cols .

Ответ №2:

Мы можем использовать

 dt[, col4 := do.call(paste, c(.SD, sep = ", ")), .SDcols = col2:col3]