r - 避免 data.table 强制 j 中的列表返回列

标签 r data.table

假设我有以下 data.table

library(data.table)

set.seed(20200210)

data <- data.table(
  x = 1:3,
  y = list(
    data.table(a=4:6, b=runif(3)),
    data.table(a=7:10, b=runif(4)),
    data.table(a=11:15, b=runif(5))
  )
)

data[]
##     x            y
##  1: 1 <data.table>
##  2: 2 <data.table>
##  3: 3 <data.table>

当我们查看y时的data.tables ,我们得到以下内容

data[, y]
##  [[1]]
##     a         b
##  1: 4 0.1019356
##  2: 5 0.5566203
##  3: 6 0.7020533
##  
##  [[2]]
##      a         b
##  1:  7 0.6080464
##  2:  8 0.4421555
##  3:  9 0.5070702
##  4: 10 0.8181770
##  
##  [[3]]
##      a         b
##  1: 11 0.8444425
##  2: 12 0.5701193
##  3: 13 0.8412783
##  4: 14 0.5692414
##  5: 15 0.8402453

到目前为止,一切正常。接下来我要做的是执行操作a+b每个 data.table并在 list 中检索结果使用data.table句法。直觉上,我会写出以下内容

data[, lapply(y, function(z){
  z[, a+b]
})]
##           V1        V2       V3
##  1: 4.101936  7.608046 11.84444
##  2: 5.556620  8.442156 12.57012
##  3: 6.702053  9.507070 13.84128
##  4: 4.101936 10.818177 14.56924
##  5: 5.556620  7.608046 15.84025
##  Warning messages:
##  1: In as.data.table.list(jval, .named = NULL) :
##    Item 1 has 3 rows but longest item has 5; recycled with remainder.
##  2: In as.data.table.list(jval, .named = NULL) :
##    Item 2 has 4 rows but longest item has 5; recycled with remainder.

但它不会工作。我的理解是,自从我的lapply将返回 list它是在 data.table[] 中定义的,它将强制返回为 data.table列,即使结果的长度不同。对我来说,这种行为是不可取的。我认为仅当长度匹配时才应将结果简化为列。

但是,以下内容实际上有效

lapply(data$y, function(z){
  z[, a+b]
})
##  [[1]]
##  [1] 4.101936 5.556620 6.702053
##  
##  [[2]]
##  [1]  7.608046  8.442156  9.507070 10.818177
##  
##  [[3]]
##  [1] 11.84444 12.57012 13.84128 14.56924 15.84025

但我宁愿使用 data.table语法是否可以访问 data对象。

有什么提示吗?

最佳答案

它正在尝试转换为单列,但 list 元素的长度不同。我们可以将其包装在列表

data[, lapply(y, function(z) list(z[,  a + b]))]

或者,如果我们需要与输入中相同的结构,请在 lapply 外部包装

out <- data[, list(lapply(y, function(z) z[, .(a +b)]))]
out
#           V1
#1: <data.table>
#2: <data.table>
#3: <data.table>

或者也可以

data[, .(lapply(y, function(z) z[, a +b]))]
#                                             V1
#1:                   4.101936,5.556620,6.702053
#2:       7.608046, 8.442156, 9.507070,10.818177
#3: 11.84444,12.57012,13.84128,14.56924,15.84025

关于r - 避免 data.table 强制 j 中的列表返回列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60157013/

相关文章:

r - 获取一段时间内的累积值计数

r - 在 dplyr 中按组加入字符串

使用多个度量变量 reshape 数据框

r - 均值的条件计算

r - 在 R 中更新 data.table 中的整行

r - 在 data.table 中自索引时出错

用于演示的 R 演示

r - ggplot2:当低条使文本超过条的底部时,如何有条件地更改 geom_text 的 vjust

R - 分组数据但对不同的列应用不同的函数

r - j 环境中使用函数进行列选择