从数据列 table 表达式创建列表
create list from columns of data table expression
考虑以下 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
因此 1
在 dt
中出现了两次,因此 a.N
是 2
,其他值的逻辑相同。
但问题是,如果原始 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
行和东西(矢量)被回收了。
这就是为什么我想在具有不同维度的列表中转换表达式 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
获取长格式的数据,然后分组聚合。
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)
考虑以下 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
因此 1
在 dt
中出现了两次,因此 a.N
是 2
,其他值的逻辑相同。
但问题是,如果原始 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
行和东西(矢量)被回收了。
这就是为什么我想在具有不同维度的列表中转换表达式 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
获取长格式的数据,然后分组聚合。
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)