将函数应用于向量元素以在新数据帧中创建行

时间:2015-03-17 01:06:51

标签: r

我有一个有趣的问题,不知道从哪里开始 - 事实上,我甚至不确定如何标题这个问题!我想要做的是将函数应用于数据框的元素,并使用它们在新的数据框中创建新行。例如,假设我们有一个数据框df1,可为各种X提供一些YState数据:

df1 <- data.frame(State=c("AL","AK"), X=c(1,3), y=c(2,4))

我想要做的是从第一个状态AL开始,并创建一个包含3行的新数据框df2,其中df2$X的新值使用3个不同的值计算提供的功能,例如:df1$Xdf1$X - 1df1$X + 1。同样,我想为df2$Y的新值做类似的事情,在此示例中,这些值计算为df1$Ydf1$Y * 0.5df1$Y * 0.5

然后,我将进入下一个State。最终结果应该是:

df2 <- data.frame(State=c("AL", "AL","AL","AK","AK","AK"), 
                      X=c(1,0,2,3,2,4), y=c(2,1,1,4,2,2))

有谁知道我怎么会接近这个?我不知道从哪里开始......我可以想象某种for循环,但我希望在R中有更优雅的方法。

2 个答案:

答案 0 :(得分:2)

你可以尝试

library(data.table)
res <- setDT(df1)[,list(X=c(X, X-1, X+1), y=c(y,y*0.5, y*0.5)) , State]
all.equal(setDF(res), df2, check.attributes=FALSE)
#[1] TRUE

答案 1 :(得分:2)

基础R解决方案:

funcs.X <- list(function(x) x, function(x) x-1, function(x) x+1)
funcs.y <- list(function(y) y, function(y) y*0.5, function(y) y*0.5)

apply.funcs <- function(funcs,x) as.vector(t(sapply(funcs, function(f) f(x))))

d <- data.frame(State = rep(df1$State,each=length(funcs.X)),
                X = apply.funcs(funcs.X, df1$X),
                y = apply.funcs(funcs.y, df1$y)
                )

identical(d,df2)
# [1] TRUE