【问题标题】:create list from columns of data table expression从数据表表达式的列创建列表
【发布时间】:2022-01-02 12:25:56
【问题描述】:

考虑以下dt

dt <- data.table(a=c(1,1,2,3),b=c(4,5,6,4))

看起来像这样:

> dt
   a b
1: 1 4
2: 1 5
3: 2 6
4: 3 4

我在这里通过每个列的唯一值聚合每列,然后计算每列有多少个唯一值:

 > dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]

   a.agg a.N b.agg b.N
1:     1   2     4   2
2:     2   1     5   1
3:     3   1     6   1

所以1dt 中出现两次,因此a.N2,其他值的逻辑相同。

但问题是,如果原始datatable 的这种转换最终具有不同的维度,那么东西会被回收。

例如这个dt:

dt <- data.table(a=c(1,1,2,3,7),b=c(4,5,6,4,4))

> dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]

   a.agg a.N b.agg b.N
1:     1   2     4   3
2:     2   1     5   1
3:     3   1     6   1
4:     7   1     4   3
Warning message:
In as.data.table.list(jval, .named = NULL) :
  Item 2 has 3 rows but longest item has 4; recycled with remainder.

这不再是正确答案,因为 b.N 现在应该只有 3 行和 things(vector) 被回收。

这就是为什么我想在具有不同维度的列表中转换表达式dt[,lapply(.SD,function(agg) dt[,.N,by=agg])],列表中的项目名称是新转换的dt 中的列名称。

我的意思的草图是:

newlist
$a.agg
1 2 3 7
$a.N
2 1 1 1
$b.agg
4 5 6 4
$b.N
3 1 1

或者更好的解决方案是获取一个datatable,并跟踪另一列上的列:

    dt_final
   agg N column
    1 2 a
    2 1 a
    3 1 a
    7 1 a
    4 3 b
    5 1 b
    6 1 b

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    获取长格式数据,然后按组聚合。

    library(data.table)
    
    dt_long <- melt(dt, measure.vars = c('a', 'b'))
    dt_long[, .N, .(variable, value)]
    
    #   variable value N
    #1:        a     1 2
    #2:        a     2 1
    #3:        a     3 1
    #4:        a     7 1
    #5:        b     4 3
    #6:        b     5 1
    #7:        b     6 1
    

    tidyverse -

    library(dplyr)
    library(tidyr)
    
    dt %>%
      pivot_longer(cols = everything()) %>%
      count(name, value)
    

    【讨论】:

    • 美丽 :) 。 measure.vars = colnames(d) 如果你有几千列。
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多