data.table rbindlist列表列

data.table rbindlist列表列,r,data.table,R,Data.table,我想将嵌套列表转换为data.table,但出现以下错误: library(data.table) res = list(list(a=1, b=2, c=list(1,2,3,4,5)), list(a=2, b=3, c=list(1,2,3,4,5))) rbindlist(res) Error in rbindlist(res) : Column 3 of item 1 is length 5, inconsistent with first column of that item

我想将嵌套列表转换为data.table,但出现以下错误:

library(data.table)
res = list(list(a=1, b=2, c=list(1,2,3,4,5)), list(a=2, b=3, c=list(1,2,3,4,5)))
rbindlist(res)
Error in rbindlist(res) : 
  Column 3 of item 1 is length 5, inconsistent with first column of that item which is length 1. rbind/rbindlist doesn't recycle as it already expects each item to be a uniform list, data.frame or data.table
我的结果应该如下所示:

data.table(a=c(1,2), b=c(2,3), c=list(c(1,2,3,4,5), c(1,2,3,4,5)))
   a b         c
1: 1 2 1,2,3,4,5
2: 2 3 1,2,3,4,5

我知道有什么方法可以改变这个列表吗?它应该在事先不知道列名的情况下工作。

我认为您需要首先处理每个子列表并将其转换以实现示例输出,如下所示

library(data.table)

res = list(list(a=1, b=2, c=list(1,2,3,4,5)), list(a=2, b=3, c=list(1,2,3,4,5)))

DTlist <- lapply(res, function(row_){
    lapply(row_, function(col_){
        if(class(col_) == 'list'){ 
          list(unlist(col_))
        }else{
          col_
        }
      })
})

rbindlist(DTlist)

抱歉,这篇文章被编辑了,因为我没有意识到这篇文章最初试图做什么。如果OP不知道子列表列是哪一列,这也是可行的。

我认为您需要首先处理每个子列表并将其转换以实现示例输出,如下所示

library(data.table)

res = list(list(a=1, b=2, c=list(1,2,3,4,5)), list(a=2, b=3, c=list(1,2,3,4,5)))

DTlist <- lapply(res, function(row_){
    lapply(row_, function(col_){
        if(class(col_) == 'list'){ 
          list(unlist(col_))
        }else{
          col_
        }
      })
})

rbindlist(DTlist)

抱歉,这篇文章被编辑了,因为我没有意识到这篇文章最初试图做什么。如果OP不知道子列表列是哪一列,这同样有效。

您想要做的很简单。但输入的格式必须如下所示:

library(data.table)
res = list(list(a=1, b=2, c=list(c(1,2,3,4,5))), list(a=2, b=3, c=list(c(1,2,3,4,5))))
rbindlist(res)
您可以使用以下代码转换输入

res = lapply(res, function(x) 
{ 
  x[[3]] <- list(unlist(x[[3]]))
  return(x)
})

你想做的很容易。但输入的格式必须如下所示:

library(data.table)
res = list(list(a=1, b=2, c=list(c(1,2,3,4,5))), list(a=2, b=3, c=list(c(1,2,3,4,5))))
rbindlist(res)
您可以使用以下代码转换输入

res = lapply(res, function(x) 
{ 
  x[[3]] <- list(unlist(x[[3]]))
  return(x)
})

通常,R希望data.frame或data.table的一列类似于向量,表示所有单个值。rbindlist需要一个data.frames列表,或者可以被视为/转换为data.frames的内容。因此,代码失败的原因是它首先尝试将输入转换为2 data.frames,其中第三列似乎比第一列和第二列长

但这是可能的,您需要强制R构造2个data.frames,每个data.frames只包含一行。所以我们需要c的值正好是长度1,我们可以把它做成一个包含一个元素的列表:一个长度为5的向量。然后我们需要告诉R它需要真正地治疗它,而不是把它转换成长度为5的东西。对于这一点,我们有一个函数I,它除了将其输入标记为AsIs之外什么也不做

res <- list(data.frame(a=1, b=2, c=I(list(c(1,2,3,4,5)))),
            data.frame(a=2, b=3, c=I(list(c(1,2,3,4,5)))))
res2 <- rbindlist(res)

甚至不需要data.frame调用,它也可以用于list。但一般来说,我认为不依赖其他函数必须首先转换您的输入效果最好。

一般来说,R希望data.frame或data.table的一列类似于向量,这意味着所有单个值。rbindlist需要一个data.frames列表,或者可以被视为/转换为data.frames的内容。因此,代码失败的原因是它首先尝试将输入转换为2 data.frames,其中第三列似乎比第一列和第二列长

但这是可能的,您需要强制R构造2个data.frames,每个data.frames只包含一行。所以我们需要c的值正好是长度1,我们可以把它做成一个包含一个元素的列表:一个长度为5的向量。然后我们需要告诉R它需要真正地治疗它,而不是把它转换成长度为5的东西。对于这一点,我们有一个函数I,它除了将其输入标记为AsIs之外什么也不做

res <- list(data.frame(a=1, b=2, c=I(list(c(1,2,3,4,5)))),
            data.frame(a=2, b=3, c=I(list(c(1,2,3,4,5)))))
res2 <- rbindlist(res)

甚至不需要data.frame调用,它也可以用于list。但一般来说,我认为不依赖于其他函数必须首先转换您的输入效果最好。

如果res很长,您可以使用res避免键入res的每个元素的列表?我没想到这会起作用,看看我的答案,但它似乎起作用了!唯一奇怪的是一旦你改变lista=。。。。对于data.framea=…,它再次中断。我如何将输入转换为正确的输入?我事先不知道哪个列是子列表。我想我需要找到每个子列表并转换它…我编辑了我的答案。但是如果你不知道哪个列是list,这是当前问题中没有问到的另一个问题。你可以使用嵌套的lapply res来完成。如果res很长,你可以使用res避免为res的每个元素键入list,嗯?我没想到这会起作用,看看我的答案,但它似乎起作用了!唯一奇怪的是一旦你改变lista=。。。。对于data.framea=…,它再次中断。我如何将输入转换为正确的输入?我事先不知道哪个列是子列表。我想我需要找到每个子列表并转换它…我编辑了我的答案。但是,如果您不知道列表是哪一列,这是当前问题中未提出的另一个问题。您可以使用转换为字符的嵌套lapply res来完成此操作。我不认为这是OP所要求的。嘿,谢谢,我没有意识到OP最初想要做什么,在看到你的答案之前,我更新了我的帖子以实现目标。我不认为这是OP要求的。嘿,谢谢,我没有意识到OP最初想要做什么,更新了我的帖子以实现目标,在看到你的答案之前你是对的,我已经编辑了我的答案。我写得太快了。你是对的,我已经编辑了我的答案。我写得太快了。你希望c列是什么类型?你希望c列是什么类型?