2016-09-02 2 views
3

Я работаю с списками отдельных списков, и каждый список содержит большое количество кадров данных. Каждый кадр данных содержит 3 переменные (cluster, grp, value), такие как (пример 1 список)R - вставить сложные стилизованные значения из списка

$`0` 
Source: local data frame [1 x 3] 

    cluster grp    value 
    (int) (int)    (chr) 
1  1  0 c Personal Care-277 

$`1` 
Source: local data frame [1 x 3] 

    cluster grp  value 
    (int) (int)  (chr) 
1  1  1 b Unpaid-1 

$`2` 
Source: local data frame [1 x 3] 

    cluster grp    value 
    (int) (int)    (chr) 
1  1  2 c Personal Care-1 

То, что я хотел бы это суммировать эту информации в векторе для того, чтобы анализировать их легко [выхода хотел]:

cluster 1 : (c Personal Care-277) - (b Unpaid-1) - (c Personal Care-1) 

То, что я пытался сделать следующее:

library(plyr) 
library(dplyr) 

1) Я сначала объединил весь фрейм данных на cluster. Я предпочитаю использовать join_all, который, кажется, отлично работает для работы, за исключением странного вывода colname.

dt1 = dt %>% lapply(fgr) %>% 
    join_all(by = 'cluster') %>% 
    `colnames<-`(c("cluster", paste('t', 1:3, sep = ''))) 

2) Тогда я использовал paste положить значения в стилизованной моде вместе

dt1 %>% 
    mutate(print = paste('cluster: ', cluster, ' (' , t1, ')', '(', t2 , ')', '(', t3 , ')', sep="")) %>% 
    select(print) 

#                print 
# 1 cluster: 1 (c Personal Care-277)(b Unpaid-1)(c Personal Care-1) 

Проблема заключается в том, что у меня есть много различных списков со многим dataframes и некоторые dataframes имеют неодинаковую length. Здесь список в примере содержит 3 элемента t1t2t3 (плюс cluster). Но в некоторых списках есть dataframes с 4 или более элементами.

Вопросы

Я хотел сначала узнать, есть ли способ автоматизировать этот paste, чтобы избежать написания t1, t2, и так далее вручную и во-вторых, если вы имели какой-либо более полное представление для рутины, чем тот, который я показал здесь.

Благодаря

данные (список)

dt = list(structure(list(cluster = structure(1L, .Label = "1", class = "factor"), 
    grp = structure(1L, .Label = "0", class = "factor"), value = structure(1L, .Label = "c Personal Care-277", class = "factor")), .Names = c("cluster", 
"grp", "value"), row.names = c(NA, -1L), class = "data.frame"), 
structure(list(cluster = structure(1L, .Label = "1", class = "factor"), 
    grp = structure(1L, .Label = "1", class = "factor"), 
    value = structure(1L, .Label = "b Unpaid-1", class = "factor")), .Names =  c("cluster", 
    "grp", "value"), row.names = c(NA, -1L), class = "data.frame"), 
    structure(list(cluster = structure(1L, .Label = "1", class = "factor"), 
    grp = structure(1L, .Label = "2", class = "factor"), 
    value = structure(1L, .Label = "c Personal Care-1", class = "factor")), .Names = c("cluster", 
    "grp", "value"), row.names = c(NA, -1L), class = "data.frame")) 
+0

Ваш выходной сигнал дает ошибки 'Ошибка в структуре (список (cluster = 1L, grp = 0L, value =" c Personal Care-277 "),: Объект 'cluster' not found' – akrun

+0

Основываясь на ожидаемом выходе, возможно, 'bind_rows (dt)%>% summary (value = paste (value, collapse =" - "))%>%. $ value' – akrun

+0

@akrun данные должны быть исправлены теперь спасибо – giacomo

ответ

2

Вы можете попробовать,

library(dplyr) 
bind_rows(dt) %>% 
     group_by(cluster) %>% 
     summarise(new = paste0('cluster: ', unique(cluster), ' (', paste(value, collapse = ','), ')')) %>% 
     select(new) 

# A tibble: 1 × 1 
#               new 
#               <chr> 
#1 cluster: 1 (c Personal Care-277,b Unpaid-1,c Personal Care-1) 
+1

спасибо, что он отлично работает – giacomo

+1

Я использовал это, наконец, чтобы быть точным 'summary (new = paste0 ('cluster:', unique (cluster), paste ('(', value, ')', collapse = '- '))) ' – giacomo

+0

@giacomoV Я рад, что это сработало. – Sotos

2

Мы можем также использовать rbindlist из data.table

library(data.table) 
rbindlist(dt)[, sprintf("cluster: %s (%s)", unique(cluster), 
     paste(unique(value), collapse=')(')), by = cluster]$V1 
#[1] "cluster: 1 (c Personal Care-277)(b Unpaid-1)(c Personal Care-1)" 
+1

спасибо! работает хорошо – giacomo

Смежные вопросы