为了账号安全,请及时绑定邮箱和手机立即绑定

使用以下内容分配多个列:= data.table,group

使用以下内容分配多个列:= data.table,group

皈依舞 2019-08-30 14:59:46
使用分配给多个列的最佳方法是什么data.table?例如:f <- function(x) {c("hi", "hello")}x <- data.table(id = 1:10)我想做这样的事情(当然这种语法不正确):x[ , (col1, col2) := f(), by = "id"]为了扩展它,我可能有很多列的名称存储在一个变量(比如说col_names)中,我想这样做:x[ , col_names := another_f(), by = "id", with = FALSE]做这样的事的正确方法是什么?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

这现在适用于R-Forge的v1.8.3。谢谢你突出它!


x <- data.table(a = 1:3, b = 1:6) 

f <- function(x) {list("hi", "hello")} 

x[ , c("col1", "col2") := f(), by = a][]

#    a b col1  col2

# 1: 1 1   hi hello

# 2: 2 2   hi hello

# 3: 3 3   hi hello

# 4: 1 4   hi hello

# 5: 2 5   hi hello

# 6: 3 6   hi hello


x[ , c("mean", "sum") := list(mean(b), sum(b)), by = a][]

#    a b col1  col2 mean sum

# 1: 1 1   hi hello  2.5   5

# 2: 2 2   hi hello  3.5   7

# 3: 3 3   hi hello  4.5   9

# 4: 1 4   hi hello  2.5   5

# 5: 2 5   hi hello  3.5   7

# 6: 3 6   hi hello  4.5   9 


mynames = c("Name1", "Longer%")

x[ , (mynames) := list(mean(b) * 4, sum(b) * 3), by = a]

#     a b col1  col2 mean sum Name1 Longer%

# 1: 1 1   hi hello  2.5   5    10      15

# 2: 2 2   hi hello  3.5   7    14      21

# 3: 3 3   hi hello  4.5   9    18      27

# 4: 1 4   hi hello  2.5   5    10      15

# 5: 2 5   hi hello  3.5   7    14      21

# 6: 3 6   hi hello  4.5   9    18      27



x[ , mynames := list(mean(b) * 4, sum(b) * 3), by = a, with = FALSE][] # same

#    a b col1  col2 mean sum Name1 Longer%

# 1: 1 1   hi hello  2.5   5    10      15

# 2: 2 2   hi hello  3.5   7    14      21

# 3: 3 3   hi hello  4.5   9    18      27

# 4: 1 4   hi hello  2.5   5    10      15

# 5: 2 5   hi hello  3.5   7    14      21

# 6: 3 6   hi hello  4.5   9    18      27


x[ , get("mynames") := list(mean(b) * 4, sum(b) * 3), by = a][]  # same

#    a b col1  col2 mean sum Name1 Longer%

# 1: 1 1   hi hello  2.5   5    10      15

# 2: 2 2   hi hello  3.5   7    14      21

# 3: 3 3   hi hello  4.5   9    18      27

# 4: 1 4   hi hello  2.5   5    10      15

# 5: 2 5   hi hello  3.5   7    14      21

# 6: 3 6   hi hello  4.5   9    18      27


x[ , eval(mynames) := list(mean(b) * 4, sum(b) * 3), by = a][]   # same

#    a b col1  col2 mean sum Name1 Longer%

# 1: 1 1   hi hello  2.5   5    10      15

# 2: 2 2   hi hello  3.5   7    14      21

# 3: 3 3   hi hello  4.5   9    18      27

# 4: 1 4   hi hello  2.5   5    10      15

# 5: 2 5   hi hello  3.5   7    14      21

# 6: 3 6   hi hello  4.5   9    18      27


查看完整回答
反对 回复 2019-08-30
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

以下简写符号可能有用。所有的功劳都归功于Andrew Brooks,特别是这篇文章。


dt[,`:=`(avg=mean(mpg), med=median(mpg), min=min(mpg)), by=cyl]


查看完整回答
反对 回复 2019-08-30
?
温温酱

TA贡献1752条经验 获得超4个赞

我应该如何修改以下行,以便从dim输出中为每个objectName获取两列,而不是一列包含两行?data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName](我正在使用data.table1.8.11)

查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信