R data.table 在group by中使用变量名赋值
R data.table use variable name for assignment in group by
我正在尝试使用字符变量作为新列的名称来总结 data.table 以及 by
。
library(data.table)
dt <- data.table(g = rep(1:3, 4), xa = runif(12), xb = runif(12))
# desired output
dt[, .(sa = mean(xa)), by = g]
g sa
1: 1 1.902360
2: 2 2.149041
3: 3 2.586044
问题是下面的代码 returns 整个 data.table 仍然没有减少到 g 的唯一值。
cn <- paste0('s', 'a')
# returns all rows
dt[, (cn) := mean(xa), by = g][]
g xa xb sa
1: 1 0.3423699 0.81447505 0.4755900
2: 2 0.0932055 0.06853225 0.5372602
3: 3 0.2486223 0.13286546 0.6465111
4: 1 0.6942175 0.66405944 0.4755900
5: 2 0.7225208 0.83110248 0.5372602
6: 3 0.9898293 0.09520907 0.6465111
7: 1 0.3523753 0.72743182 0.4755900
8: 2 0.5504942 0.01966303 0.5372602
9: 3 0.3523625 0.55257436 0.6465111
10: 1 0.5133974 0.39650089 0.4755900
11: 2 0.7828203 0.89909528 0.5372602
12: 3 0.9952302 0.16872205 0.6465111
如何获得通常的摘要data.table? (这是一个简化的例子,在我的实际问题中,会有多个名字传递给一个循环)
使用 setNames
环绕 list
(.(mean(xa))
) 列或
dt[, setNames(.(mean(xa)), cn), by = g]
# g sa
#1: 1 0.2010599
#2: 2 0.4710056
#3: 3 0.4871248
或得到汇总输出后的setnames
setnames(dt[, mean(xa), by = g], 'V1', cn)[]
在data.table
中,:=
运算符用于creating/modifying原始数据集中的列。但是,这个运算符在 tidyverse
上下文
中使用时是不同的
library(dplyr)
dt %>%
group_by(g) %>%
summarise(!! cn := mean(xa), .groups = 'drop')
# A tibble: 3 x 2
# g sa
# <int> <dbl>
#1 1 0.201
#2 2 0.471
#3 3 0.487
有一个待处理的 PR 将使此类操作更加容易,
data.table#4304。一旦在当前设计中实现,查询将如下所示:
dt[, .(cn = mean(xa)), by = g, env = list(cn="sa")]
# g sa
# <int> <num>
#1: 1 0.2060352
#2: 2 0.1707827
#3: 3 0.6850591
安装PR分支
remotes::install_github("Rdatatable/data.table@programming")
数据
library(data.table)
dt <- data.table(g = rep(1:3, 4), xa = runif(12), xb = runif(12))
我正在尝试使用字符变量作为新列的名称来总结 data.table 以及 by
。
library(data.table)
dt <- data.table(g = rep(1:3, 4), xa = runif(12), xb = runif(12))
# desired output
dt[, .(sa = mean(xa)), by = g]
g sa
1: 1 1.902360
2: 2 2.149041
3: 3 2.586044
问题是下面的代码 returns 整个 data.table 仍然没有减少到 g 的唯一值。
cn <- paste0('s', 'a')
# returns all rows
dt[, (cn) := mean(xa), by = g][]
g xa xb sa
1: 1 0.3423699 0.81447505 0.4755900
2: 2 0.0932055 0.06853225 0.5372602
3: 3 0.2486223 0.13286546 0.6465111
4: 1 0.6942175 0.66405944 0.4755900
5: 2 0.7225208 0.83110248 0.5372602
6: 3 0.9898293 0.09520907 0.6465111
7: 1 0.3523753 0.72743182 0.4755900
8: 2 0.5504942 0.01966303 0.5372602
9: 3 0.3523625 0.55257436 0.6465111
10: 1 0.5133974 0.39650089 0.4755900
11: 2 0.7828203 0.89909528 0.5372602
12: 3 0.9952302 0.16872205 0.6465111
如何获得通常的摘要data.table? (这是一个简化的例子,在我的实际问题中,会有多个名字传递给一个循环)
使用 setNames
环绕 list
(.(mean(xa))
) 列或
dt[, setNames(.(mean(xa)), cn), by = g]
# g sa
#1: 1 0.2010599
#2: 2 0.4710056
#3: 3 0.4871248
或得到汇总输出后的setnames
setnames(dt[, mean(xa), by = g], 'V1', cn)[]
在data.table
中,:=
运算符用于creating/modifying原始数据集中的列。但是,这个运算符在 tidyverse
上下文
library(dplyr)
dt %>%
group_by(g) %>%
summarise(!! cn := mean(xa), .groups = 'drop')
# A tibble: 3 x 2
# g sa
# <int> <dbl>
#1 1 0.201
#2 2 0.471
#3 3 0.487
有一个待处理的 PR 将使此类操作更加容易, data.table#4304。一旦在当前设计中实现,查询将如下所示:
dt[, .(cn = mean(xa)), by = g, env = list(cn="sa")]
# g sa
# <int> <num>
#1: 1 0.2060352
#2: 2 0.1707827
#3: 3 0.6850591
安装PR分支
remotes::install_github("Rdatatable/data.table@programming")
数据
library(data.table)
dt <- data.table(g = rep(1:3, 4), xa = runif(12), xb = runif(12))