R展平列表按列列出

时间:2016-03-27 14:31:00

标签: r list

我有一个列表女巫看起来像那样:

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"

这应该是一种简单的方法,但我无法找到。有什么帮助吗?

3 个答案:

答案 0 :(得分: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和message都有一列,第二个字段用逗号分隔它们。

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)

答案 1 :(得分: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"

答案 2 :(得分: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))