我有一个有趣的问题,不知道从哪里开始 - 事实上,我甚至不确定如何标题这个问题!我想要做的是将函数应用于数据框的元素,并使用它们在新的数据框中创建新行。例如,假设我们有一个数据框df1
,可为各种X
提供一些Y
和State
数据:
df1 <- data.frame(State=c("AL","AK"), X=c(1,3), y=c(2,4))
我想要做的是从第一个状态AL
开始,并创建一个包含3行的新数据框df2
,其中df2$X
的新值使用3个不同的值计算提供的功能,例如:df1$X
,df1$X - 1
和df1$X + 1
。同样,我想为df2$Y
的新值做类似的事情,在此示例中,这些值计算为df1$Y
,df1$Y * 0.5
和df1$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中有更优雅的方法。
答案 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