Строительство tibble из другого tibble (без циклов?)


tibbles документации

Я делаю то, что хочу, но это с помощью цикла for и я читал много раз, чтобы избежать циклов в R для эффективности и стиля. Ну, это не является вычислительно сложной задачей, и я думаю, что это может быть так же ясно, как это может быть в цикле for. В любом случае, это кажется немного хитрым, чтобы процесс функционально, а не итерационно.

Я начинаю с одного tibble: source_tbl.
Я хочу сделать еще один tibble: constructed_tbl.
Каждый столбец в constructed_tbl сумма подмножества столбцов в source_tbl.

Сопоставление столбца хранится в col_conversion_tbl.

>print(col_conversion_tbl)

# A tibble: 6 x 2
source_col       constructed_col
<chr>            <chr>
1 col1             A
2 col2             A
3 col3             A
4 col4             A
5 col5             B
6 col6             B

Так,
constructed_tbl[,'A']

должна быть равна ...

rowSums(source_tbl[,c('col1','col2','col3','col4')])

Лучший способ я придумать

Лучший способ я придумал это

  • преобразования col_conversion_tbl в список, col_conversion_lst, где каждый элемент является массивом source_colS и назван в честь constructed_col.
  • инициализировать пустой constructed_tbl tibble Вт/ соответствующий параметр nrows, ncols, и имена столбцов
  • Цикл names(col_conversion_lst) замена пустой столбец constructed_tbl с суммой соответствующих столбцов source_tbl.

Вот мой код

library(tibble)
library(magrittr)
library(purrr)

source_tbl <- tibble(col1=c(1,1,1),col2=c(2,2,2),col3=c(3,3,3),col4=c(4,4,4),col5=c(5,5,5),col6=c(6,6,6))
col_conversion_tbl <- tibble(source_col = c('col1','col2','col3','col4','col5','col6'), constructed_col = c('A','A','A','A','B','B'))

col_conversion_lst <- col_conversion_tbl %>% 
    split(.$constructed_col) %>% 
    map(~.$source_col)

constructed_tbl <- as_tibble(matrix(nrow=nrow(source_tbl),ncol= length(col_conversion_lst) ))
colnames(constructed_tbl) <- names(col_conversion_lst)  

for (n in names(col_conversion_lst)){
    constructed_tbl[,n] <- rowSums(source_tbl[ ,col_conversion_lst[[n]]])
}


237
2
r
задан 16 марта 2018 в 07:03 Источник Поделиться
Комментарии
1 ответ

Я хотел бы использовать перемножение матриц. Она является эффективной и приводит к гораздо более короткий код, как вы можете видеть:

constructed_tbl <- as.tibble(as.matrix(source_tbl) %*% table(col_conversion_tbl))

4
ответ дан 17 марта 2018 в 04:03 Источник Поделиться