在data.table中按组转置矢量

时间:2016-06-10 14:32:05

标签: r data.table

什么是惯用的data.table方法来生成一个data.table,它有一个函数返回的向量元素的单独列,由group计算?

考虑data.table:

library(data.table)
data(iris)
setDT(iris)

如果函数是range(),我希望输出类似于:

iris[, .(min_petal_width = min(Petal.Width), 
         max_petal_width = max(Petal.Width)
         ), keyby = Species] # produces desired output

但使用range()函数。

我可以使用dcast,但这很难看:

dcast(
  iris[, .( petal_width = range(Petal.Width), 
            value = c("min_petal_width", "max_petal_width")), 
       keyby = Species],
  Species ~ value, value.var = "petal_width")

我希望有一个更简单的表达方式:

iris[, (c("min_petal_width","max_petal_width")) = range(Petal.Width), 
      keyby = Species] # doesn't work

3 个答案:

答案 0 :(得分:6)

你也可以这样做:

EditText firstAns = (EditText) findViewById(R.id.first_ans);

if (firstAns.getText() == null) return;

// rest of your code

答案 1 :(得分:5)

你的方法非常接近。请记住,您需要将一个列表提供给data.table,它会很乐意接受它。因此,您可以使用:

iris[, c("min_petal_width","max_petal_width") := as.list(range(Petal.Width)), 
     by = Species]

我误解了这个问题。由于您想要汇总结果而不是添加新列,您可以使用

cols <- c("min_petal_width", "max_petal_width")
iris[, setNames(as.list(range(Petal.Width)), cols), keyby = Species] 

但我确信还有其他一些data.table方法。

答案 2 :(得分:2)

如果可读性和简洁性对您来说非常重要,我会定义一个自定义函数或二元运算符,然后您可以在data.table子集表达式中轻松使用它,例如: :

# custom function
.nm <- function(v,vnames){
  `names<-`(as.list(v),vnames)
}
# custom binary operator
`%=%` <- function(vnames,v){
  `names<-`(as.list(v),vnames)
}

# using custom function
iris[, .nm(range(Petal.Width),c("min_petal_width", "max_petal_width")), keyby = Species]

# using custom binary operator
iris[, c("min_petal_width", "max_petal_width") %=% range(Petal.Width), keyby = Species]