【问题标题】:R data.table to list of rows; better ways?R data.table 到行列表;更好的方法?
【发布时间】:2015-03-03 06:13:15
【问题描述】:

我想将 R data.table 转换为行列表(每一行都由一个列表表示)。到目前为止,我已经找到了两种方法:

library(data.table)

x.dt = data.table(x = seq(1, 10), y = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"), key="x")

# Using lapply & split
x.list.1 = lapply(split(x.dt, rownames(x.dt)), as.list)

# Using Lapply
x.list.2 = lapply(as.list(1:nrow(x.dt)), function(row) as.list(x.dt[row[1],]))

在我看来,它们都有些笨拙。有没有更好(更简洁)的方法?

亲切的问候, 赫尔曼

【问题讨论】:

  • 出于好奇:为什么?这似乎没什么用,而且通常是个坏主意。
  • @Roland 我需要将表格的摘要导出到嵌套树结构 (JSON)。

标签: r list data.table


【解决方案1】:

使用按行应用:

x.list.3 <- apply(x.dt,1,as.list)

【讨论】:

  • 这个解决方案有个问题:apply 返回一个原子向量。因此,即使您的数据框中有不同类型的列,您应用的行也包含所有具有相同数据类型的元素。这可能不是你想要的。
【解决方案2】:

我不知道这是否不那么笨重,但这很有效:

as.list(as.data.table(t(x.dt)))

您使用t() 转置data.table,然后再次将其声明为data.table,将其变为list

输出:

$V1
[1] " 1" "a" 

$V2
[1] " 2" "b" 

$V3
[1] " 3" "c" 

$V4
[1] " 4" "d" 

$V5
[1] " 5" "e" 

$V6
[1] " 6" "f" 

$V7
[1] " 7" "g" 

$V8
[1] " 8" "h" 

$V9
[1] " 9" "i" 

$V10
[1] "10" "j"

正如@akrun 在 cmets 中指出的,这里的输出与您的示例不同,但它仍然是列表中的每一行,因此您可能会发现更好或更糟。

编辑 正如@David Arenburg 在 cmets 中指出的那样,

as.list(unlist(t(x.dt)))

提供与问题中的两个示例相同的输出。

【讨论】:

  • 稍作改动就可以达到OP想要的输出as.list(unlist(t(x.dt)))
  • 这可行,但我不保留类型。在我的示例中,所有内容都被强制转换为字符串。 @Marat Talipov 的解决方案也是如此。
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2015-04-08
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多