2016-03-27 7 views
-1

У меня есть список ведьм выглядеть:список R Свести к списку столбцами

created_time : chr "2015-12-30T04:04:09+0000" 
from.name : chr "John" 
message : chr "Lorem ipsum dolor sit amet" 
created_time : chr "2015-12-30T04:04:09+0000" 
from.name : chr "Peter" 
message : chr "Ut labore et dolore magna aliqua" 
created_time : chr "2016-12-30T04:04:09+0000" 
from.name : chr "Mike" 
message : chr "Nam at euismod risus" 

И я хотел бы, чтобы преобразовать его, как это ...

created_time : char [1:3] "2015-12-30T04:04:09+0000" "2015-12-30T04:04:09+0000" "2016-12-30T04:04:09+0000" 
from.name: char [1:3] "John" "Peter" "Mike" 
message: char [1:3] "Lorem ipsum dolor sit amet" "Ut labore et dolore magna aliqua" "Nam at euismod risus" 

Это должно быть легко способ сделать это, но я не могу найти. Любая помощь?

+1

Просьба представить данные в воспроизводимой форме. Если x - ваш ввод, выведите вывод dput (x) в свой вопрос. –

ответ

0

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

l1 <- split(unlist(l, use.names=FALSE), names(l)) 
str(l1) 
#List of 3 
#$ created_time: chr [1:3] "2015-12-30T04:04:09+0000" "2015-12-30T04:04:09+0000" "2016-12-30T04:04:09+0000" 
#$ from.name : chr [1:3] "John" "Peter" "Mike" 
#$ message  : chr [1:3] "Lorem ipsum dolor sit amet" "Ut labore et dolore magna aliqua" "Nam at euismod risus" 

Или другой вариант

with(stack(l), split(values, ind)) 
+1

Эта работа замечательная! Благодаря. –

0

Вот некоторые варианты, предполагающие в первых двух, что вход, как в Lines и в третьем, что вход, как в L

1) Это дает кадр данных которого первый столбец является первым поле, а остальные столбцы - это второе поле для этого первого поля.

Lines <- 'created_time : chr "2015-12-30T04:04:09+0000" 
from.name : chr "John" 
message : chr "Lorem ipsum dolor sit amet" 
created_time : chr "2015-12-30T04:04:09+0000" 
from.name : chr "Peter" 
message : chr "Ut labore et dolore magna aliqua" 
created_time : chr "2016-12-30T04:04:09+0000" 
from.name : chr "Mike" 
message : chr "Nam at euismod risus"' 

DF <- read.table(text = Lines, sep = ":", as.is = TRUE) 
aggregate(V2 ~ V1, DF, c) 

2) Другая возможность состоит в следующем, который производит фрейм данных с одного столбца для каждого из create_time, from.name и сообщение со вторыми полями склеенных запятыми разделяющих их.

read.dcf(textConnection(Lines), all = TRUE) 

3) Если вход выглядит так, а не как предполагалось в предыдущих двух точках, то используйте split:

L <- list(created_time = "2015-12-30T04:04:09+0000", 
      from.name = "John", 
      message = "Lorem ipsum dolor sit amet", 
      created_time = "2015-12-30T04:04:09+0000", 
      from.name = "Peter", 
      message = "Ut labore et dolore magna aliqua", 
      created_time = "2016-12-30T04:04:09+0000", 
      from.name = "Mike", 
      message = "Nam at euismod risus") 

sapply(split(L, names(L)), c) 
0

Позвольте мне знать, если это то, что вы ищете:

l <- list(created_time="2015-12-30T04:04:09+0000",from.name="John",message="Lorem ipsum dolor sit amet",created_time="2015-12-30T04:04:09+0000",from.name="Peter",message="Ut labore et dolore magna aliqua",created_time="2016-12-30T04:04:09+0000",from.name="Mike",message="Nam at euismod risus"); 
str(l); 
## List of 9 
## $ created_time: chr "2015-12-30T04:04:09+0000" 
## $ from.name : chr "John" 
## $ message  : chr "Lorem ipsum dolor sit amet" 
## $ created_time: chr "2015-12-30T04:04:09+0000" 
## $ from.name : chr "Peter" 
## $ message  : chr "Ut labore et dolore magna aliqua" 
## $ created_time: chr "2016-12-30T04:04:09+0000" 
## $ from.name : chr "Mike" 
## $ message  : chr "Nam at euismod risus" 
ns <- unique(names(l)); 
res <- setNames(lapply(ns,function(n) unname(do.call(c,l[names(l)==n]))),ns); 
str(res); 
## List of 3 
## $ created_time: chr [1:3] "2015-12-30T04:04:09+0000" "2015-12-30T04:04:09+0000" "2016-12-30T04:04:09+0000" 
## $ from.name : chr [1:3] "John" "Peter" "Mike" 
## $ message  : chr [1:3] "Lorem ipsum dolor sit amet" "Ut labore et dolore magna aliqua" "Nam at euismod risus" 
Смежные вопросы