修改函数以基于列的值返回表达式

时间:2018-03-01 18:38:37

标签: r function grep

假设我有以下Dataframe(可重现的示例如下):

DF <- data.frame(ID=c(12345,12345,13425),NumTrans=c("1-2","2-3","1-3"),Cov1=c(1500,1000,2000),cov2=c(1,0,1))

字段NumTrans表示状态之间的转换:主题12345,例如,状态1和2之间的转换,依此类推。 编写函数&#34; func&#34;如下,

func=function(x){
a=paste0("exp(",x[1],"*x","+",x[2],"*y)")
return(a)
}

允许您将每个ID与输出exp的表达式相关联(Cov1 * x1 + Cov2 * y):

by(DF[3:4],DF[1],func)

ID: 12345
[1] "exp(c(1500, 1000)*x+c(1, 0)*y)"
-----------------------------------------
ID: 13425
[1] "exp(2000*x+1*y)"

但是,我需要的是略有不同。

1)有没有办法修改这个功能,以便在&#34; * x&#34;和&#34; * y&#34;你取而代之的是#34; * x_NumTrans&#34;和&#34; * y_NumTrans&#34;,其中 NumTrans是那一行的NumTrans吗?

2)是否可以编写一个返回此输出但等于行数的函数?

换句话说,所需的输出类似于:

[1] "exp(c(1500, 1000)*x_1-2+c(1, 0)*y_1-2)"
----------------------------------------------
[2] "exp(c(1500, 1000)*x_2-3+c(1, 0)*y_2-3)"
----------------------------------------------
[3] "exp(2000*x_1-3+1*y_1-3)"
----------------------------------------------

甚至更好,一个解决方案,将每个表达式放在一个可以附加到DF ...

的列中

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式执行此操作。分为两个部分。第一个用于c(*,*)的用户,然后使用NumTrans

粘贴结果
byAns <- by(DF[2:4], DF[1], function(x) {
    s1 <- paste0("exp(", x[2], "*x_")
    s2 <- paste0("+", x[3], "*y_")
    paste0(s1, x[[1]], s2, x[[1]], ")")
})