【发布时间】:2020-04-21 13:25:39
【问题描述】:
我正在尝试调用用户定义的函数来创建一个新列,该列取决于我的 data.table 的其他列的值。在简单的情况下,我没有遇到任何错误,但是当我使用条件语句或循环时,看起来好像用户定义的函数接收了整个列作为参数。
从其他有关堆栈溢出的案例中学习(例如:R data.table user defined function),我了解到使用 ifelse 函数的 if 语句可以克服这个问题。但是,我找不到循环语句的解决方案。
请看下面我要运行的代码,它返回以下错误消息:Error in seq.default(1, a, 1) : 'to' must be of length 1
test <-data.table(a=c(1,2))
f <- function(a) {
out <- 0
for (i in seq(1,a,1)){
out <- out +1
}
return(out)
}
test[,b:=f(a)]
显然,f(x)=x 但为了简单起见,我选择了这个函数。另请注意,将seq(1,a,1) 替换为1:a 会引发以下警告消息:In 1:a : numerical expression has 2 elements: only the first used。
以下是对所需行为的更详细说明。
test <-data.table(a=c(1,2,3),b=c(4,5,6))
f <- function(a,b){
out <-0
for (i in seq(1,a,1)){
out <- out + b^(i)
}
return(out)
}
我想让test[,c=f(a,b)] 给:
test
# a b c
# 1 4 4
# 2 5 30 # 5 + 5^2
# 3 6 258 # 6 + 6^2 + 6^3
有没有办法获得所需的行为?
【问题讨论】:
-
是的,这就是问题的根源。但是,对于
dt<-data.table(a=c(1,2)),以这种方式调用g<-function(a){return(a)}dt[,b:=g(a)]会导致期望的结果。函数 g 只接受一个参数(行中的那个),而不是整行。 -
再次感谢您的回答。我要使用的功能比这个更复杂,它需要使用一列的元素作为要完成的循环数。我想不出任何解决方法。例如,输入列
1,2,3我希望输出列1,2+2^2,3+3^2+3^3调用函数f <- function(a){out<-0/n for (i in 1:a){out<- out + a^a}/n return(a)} -
不,因为这样,每一行都会得到相同的结果。我将通过对所需结果的更详细解释来更新问题。谢谢!
标签: r data.table