【问题标题】:Pass a column (name and value) of a data.table to the function将 data.table 的列(名称和值)传递给函数
【发布时间】:2015-09-15 13:41:36
【问题描述】:

我想写一个简单的函数来计算 Var1 的平均值:

data<-structure(list(time = structure(c(1358832600, 1358832600), class = c("POSIXct", 
"POSIXt"), tzone = ""), Var1 = c(0.4, 0.2)), .Names = c("time", 
"Var1"), row.names = c(NA, -2L), class = "data.frame")

data<- data.table(data)

time                Var1
2013-01-22 09:30:00 0.4
2013-01-22 09:30:00 0.2

Aggregated.Data<- function(data, col) {
 aggregated <- ddply(data, time, summarise, col= mean(eval(col)))
 return(aggregated)
}

aggregated.data <- Aggregated.Data(data, quote(Var1))
Everything works, output:

time           Col
2013-01-22 09:30:00 0.3

问题:

  1. 这是正确的方法吗?我的意思是使用报价和评估?
  2. 为什么输出中的第二列名称是 col,如何将其更改为 Var1?

编辑:使用 data.table

Aggregated.Data<- function(data, col) {
 aggregated <- data(data, list(col=mean(eval(substitute(col)))), by=list(time=time))
 return(aggregated)
}

【问题讨论】:

  • 如果您使用data.table,为什么不使用data.table 方法?
  • @akrun,我实际上正在使用data.table 方法,但我最终遇到了同样的问题。
  • 也许f1 &lt;- function(dat, col){ DT &lt;- dat[, mean(.SD[[1]]), time, .SDcols=col]; setnames(DT, 2, col); DT } 或者你可以使用DT &lt;- dat[, mean(dat[[col]]), time]
  • 你试过函数f1f1(data, 'Var1')
  • 是的,它奏效了。我看到了区别。

标签: r function data.table


【解决方案1】:

一种选择是使用eval(as.name) 并获取mean。我们可以稍后使用setnames 更改列名。

f1 <- function(dat, col){
 DT <- dat[, mean(eval(as.name(col))), time]
 v1 <- setdiff(colnames(DT), colnames(dat))
 setnames(DT, v1, col)
 DT 
}


f1(data, 'Var1')
#                  time Var1
#1: 2013-01-22 00:30:00  0.3

【讨论】:

  • 这两个选项看起来不同。因为您正在进行按组操作,所以您的第一个选项查看组内的col,而第二个选项查看显然没有按组拆分的dat[[col]],对吗?另外,在我看来,按位置传递 by arg 相当晦涩。
  • @Frank 我没有正确测试它。感谢您的输入。删除了第二个选项。
【解决方案2】:
library(dplyr)
library(lazyeval)

summarize_column = function(data, variable_name)
  data %>% 
    group_by(time) %>% 
    select_(lazy(variable_name)) %>% 
    summarize_each(funs(mean))

data %>% summarize_column(Var1)

【讨论】:

  • 这是另一种方式,问题是当您将data.table发送到函数时。
  • 问题是关于将 data.table 的列 [name, value] 传递给函数。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2017-04-15
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多