gpt4 book ai didi

r - 分组时折叠 data.table 列值

转载 作者:行者123 更新时间:2023-12-04 17:36:51 36 4
gpt4 key购买 nike

给定一个 data.table对象我会将一些分组列的值折叠到一个对象中,然后将生成的对象插入到一个新的列中。

dt <- data.table(
c('A|A', 'B|A', 'A|A', 'B|A', 'A|B'),
c(0, 0, 1, 1, 0),
c(22.7, 1.2, 0.3, 0.4, 0.0)
)
setnames(dt, names(dt), c('GROUPING', 'NAME', 'VALUE'))
dt
# GROUPING NAME VALUE
# 1: A|A 0 22.7
# 2: B|A 0 1.2
# 3: A|A 1 0.3
# 4: B|A 1 0.4
# 5: A|B 0 0.0

我认为首先需要指定要分组的列,所以我应该从 dt[, OBJECTS := <expr>, by = GROUPING] 之类的内容开始。 .

不幸的是,我不知道表达式 <expr>使用,结果如下:
#    GROUPING   OBJECTS
# 1: A|A <vector>
# 2: B|A <vector>
# 3: A|B <vector>

每个 <vector>必须包含其他列的值。例如第一个 <vector>必须是一个命名向量,相当于:
eg <- c(22.7, 0.3)
names(eg) <- c('0', '1')
# 0 1
# 22.7 0.3

最佳答案

j 内部工作: 如果你想让一个列的值成为一个向量,你需要将输出包装在 list(.) 中。 .
j本身需要调用 list ,因此您的最终表达式将类似于嵌套的 list ,例如:

dt[, list(allNames=list(NAME), allValues=list(VALUE)), by=GROUPING]

# GROUPING allNames allValues
# 1: A|A 0,1 22.7,0.3
# 2: B|A 0,1 1.2,0.4
# 3: A|B 0 0

正如@Mnel 指出的那样,等效地:
dt[, lapply(.SD, list), by=GROUPING]

如果你想要它的长格式,那么你的 <expr> 的结构将会: list( c( list(), list(), ..., list() ) )例如:
dt[, list(c(list(NAME), list(VALUE))), by=GROUPING]

# GROUPING V1
# 1: A|A 0,1
# 2: A|A 22.7,0.3
# 3: B|A 0,1
# 4: B|A 1.2,0.4
# 5: A|B 0
# 6: A|B 0

或等效地:
dt[, list(lapply(.SD, c)), by=GROUPING]

关于r - 分组时折叠 data.table 列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16051608/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com