【问题标题】:Taking values from data table rows and putting it in a cell as a list in R从数据表行中获取值并将其作为 R 中的列表放入单元格中
【发布时间】:2021-10-01 07:02:12
【问题描述】:

我正在尝试将一个列表放入每个数据表单元格中,其中列表来自其他列的值。我不想明确输入每列的名称。基本上我想重做以下工作示例,而不必明确引用 V1、V2:

# Create a data table as an example:
dat <- data.table(V1 = c(1:4), V2 = c('A','B','C','D'))
print(dat)
   V1 V2
1:  1  A
2:  2  B
3:  3  C
4:  4  D

现在我创建一个包含行值列表的新变量 V3:

dat[, id := rownames(dat)] # Creating unique id per row
dat[, V3 := list(list(list(V1,V2))), by = 'id']
print(dat)
   V1 V2 id        V3
1:  1  A  1 <list[2]>
2:  2  B  2 <list[2]>
3:  3  C  3 <list[2]>
4:  4  D  4 <list[2]>

并且我们可以看到V3的第一个元素是正确的,由列表1,A组成:

unlist(dat$V3[[1]])
[1] "1" "A"

如何在不必明确列出 V1 和 V2 的情况下进行此过程(实际上,在我的代码中,我必须为 60 多个变量执行此操作(即从 60 个变量的行中获取列表),所以我不想要写 list(list(list(V1, V2, V3, ..., V60)?

【问题讨论】:

    标签: r list data.table apply lapply


    【解决方案1】:

    你可以使用apply -

    library(data.table)
    
    dat <- data.table(V1 = c(1:4), V2 = c('A','B','C','D'))
    dat[, V3 := apply(.SD, 1, as.list), .SDcols = V1:V2]
    dat
    
    #   V1 V2        V3
    #1:  1  A <list[2]>
    #2:  2  B <list[2]>
    #3:  3  C <list[2]>
    #4:  4  D <list[2]>
    
    unlist(dat$V3[[1]])
    # V1  V2 
    #"1" "A" 
    

    如果您需要未命名的向量,请在 apply 中使用 unname(.SD)

    【讨论】:

      【解决方案2】:

      我认为这可以解决问题

      dat[, v3 := lapply(transpose(dat), as.list)]
      #    V1 V2        v3
      # 1:  1  A <list[2]>
      # 2:  2  B <list[2]>
      # 3:  3  C <list[2]>
      # 4:  4  D <list[2]>
      
      unlist(dat$v3[[1]])
      #[1] "1" "A"
      

      【讨论】:

      • 您的解决方案有效,但我接受了另一个解决方案,因为对于我的数据集,您的解决方案需要 8.16 秒,而接受的答案需要 6.78 秒 :)
      【解决方案3】:

      我们可以像下面这样使用Map + asplit

      > dat[, V3 := Map(as.list, asplit(.SD, 1))][]
         V1 V2        V3
      1:  1  A <list[2]>
      2:  2  B <list[2]>
      3:  3  C <list[2]>
      4:  4  D <list[2]>
      

      【讨论】:

      • 简洁明了
      • 非常感谢!我再次接受另一个答案,因为它稍微快一点:) 但是这个答案真的很好,因为我不知道如何使用 Map!
      【解决方案4】:

      使用Map 我们可以做到

      dat[, V3 := do.call(Map, c(f = function(x, y) as.list(c(x, y)), unname(.SD)))] 
      dat
         V1 V2        V3
      1:  1  A <list[2]>
      2:  2  B <list[2]>
      3:  3  C <list[2]>
      4:  4  D <list[2]>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2020-02-09
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        相关资源
        最近更新 更多