【问题标题】:Convert a data.table to list of rows that are data.tables and apply a function to each row将 data.table 转换为 data.tables 的行列表并将函数应用于每一行
【发布时间】:2019-07-05 11:09:42
【问题描述】:

假设,我在 R 中有一个 data.table。我想将它转换为一个列表,其中每个元素都是一个单独的 data.table,它只包含一行。然后我有一个应用于每个单行数据表的函数。我想 rbind 输出。

我尝试了许多版本的 apply 系列,但无法正常工作。

我想执行以下操作,但使用应用函数作为我的真实数据。表非常大并且有很多。而且,实际的功能要复杂得多。

DT <- data.table(
  ID = c("b","a","c"),
  a = 1:3,
  b = 7:9,
  c = 13:15
)

DT1<-DT[1]
DT2<-DT[2]
DT3<-DT[3]

list<-list(DT1, DT2, DT3)

myfunction<-function(D){
  return(rbind(D, D))
}

DT1new<-myfunction(list[[1]])
DT2new<-myfunction(list[[2]])
DT3new<-myfunction(list[[3]])

result<-rbind(DT1new, DT2new, DT3new)
result

【问题讨论】:

  • 应用程序是什么?您要寻找的最终结果是什么?
  • 谢谢,我稍微改了一下问题。现在应该很清楚了!
  • 你需要DT[rep(1:nrow(DT), each = 2)]DT[DT[, rep(.I, each = 2)]]一样吗?
  • 实际功能远不止重复行。而且只需要一行data.tables。
  • @maja 我仍然相信您可以绕过第一步,但如果没有进一步的信息就无法提供详细的线索。

标签: r list data.table apply rows


【解决方案1】:

至于您的第一个愿望:将 data.table 转换为许多列表,其中每个表是原始表中的一行:

lapply(seq_len(nrow(DT)), function(i) DT[i])
# or
split(DT, seq_len(nrow(DT)))

根据应用程序的当前描述判断(重复当前的每一行),您可以绕过这第一步:

DT[rep(seq_len(.N), each = 2)]
# or 
DT[, .SD[c(1,1)], by = seq_len(nrow(DT))]

更一般地说,您应该能够做到(一次操作一行):

DT[, myFunction(.SD), by = seq_len(nrow(DT))]

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2013-05-07
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多