【问题标题】:r - getting vectors from rows in data.tabler - 从 data.table 中的行获取向量
【发布时间】:2019-05-13 20:23:39
【问题描述】:

我有一个从 csv 文件(本质上是 SQL 查询的结果)中读取的大 data.table。每条记录都有几组 20 个字段,它们是特定事物(例如,特定类型的付款)的年度数据。这是一个简化版本,只有 5 行和 3 个年度贡献字段

> dt <- data.table(id=1:5, dob = sample(1950:2000, 5), cont01=11:15, cont02=21:25, cont03=31:35)
> dt
   id  dob cont01 cont02 cont03
1:  1 1981     11     21     31
2:  2 1954     12     22     32
3:  3 1985     13     23     33
4:  4 1986     14     24     34
5:  5 1970     15     25     35

我希望至少得到一个向量列表,每个记录一个向量:

list (c(11, 21, 31), c(12, 22, 32), c(13, 23, 33), c(14, 24, 34), c(15, 25, 35))

不过,理想情况下,我想我希望向量位于数据表中,作为一个新列。更理想的是,我需要向量是固定长度的,每个元素都在特定年龄支付。所以第一行这 3 列的向量是

> c(rep(0, 5), 11, 21, 31, rep(0, 38))

向量中的第一个年龄是 15 岁,最后一个是 60 岁。

this question 看来,列表的 data.table 列是可能的。但是我还没有弄清楚如何从同一行中的其他列创建内容。

例如:

> dt[1, list(list(c(.SD))), .SDcols=c("cont2011", "cont2012", "cont2013")]
       V1
1: <list>
> dt[1, list(list(c(.SD))), .SDcols=c("cont2011", "cont2012", "cont2013")][,V1]
[[1]]
[[1]]$`cont2011`
[1] 11

[[1]]$cont2012
[1] 21

[[1]]$cont2013
[1] 31

似乎并没有真正提供我想要的东西,因为我看不到如何在V1 列的内容上做一些漂亮的矢量事情。 (我需要在我得到的向量上做很多欧几里得距离类型的事情)。

有什么想法吗?对替代方法的建议? data.table 中有大约 1300 万行,以及 5 组 20(左右)列,我希望能够这样做。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以使用以下代码创建新的列表列。

    dt[, newcol := .(.(c(cont01, cont02, cont03))), by = id]
    
    #    id  dob cont01 cont02 cont03   newcol
    # 1:  1 1993     11     21     31 11,21,31
    # 2:  2 1960     12     22     32 12,22,32
    # 3:  3 1977     13     23     33 13,23,33
    # 4:  4 1955     14     24     34 14,24,34
    # 5:  5 1959     15     25     35 15,25,35
    

    给出相同结果的另一个选项是

    dt[, newcol := .(.(unlist(.SD))), by = id, .SDcols = names(dt)[3:5]]
    

    函数. 只是list 的别名,在[.data.table 中可用。

    【讨论】:

    • 第二个对我有用,因为这意味着我可以构建包含 20 列的列表(令人难以置信的是它们甚至不连续),而无需输入每一列。
    【解决方案2】:

    我们通过数据的row 索引和unlist 对数据集的列进行子集化,split

    subdt <- as.data.frame(dt[, 3:5, with = FALSE])
    lapply(split(subdt, row(subdt)), unlist, use.names = FALSE)
    

    或者在对列进行子集化之后,通过转置将其转换为matrix,然后通过colcol 索引将其转换为splitmatrix

    m1 <- t(dt[, 3:5]) 
    unname(split(m1, col(m1)))
    #[[1]]
    #[1] 11 21 31
    
    #[[2]]
    #[1] 12 22 32
    
    #[[3]]
    #[1] 13 23 33
    
    #[[4]]
    #[1] 14 24 34
    
    #[[5]]
    #[1] 15 25 35
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2016-11-03
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多