通过将两列分组并将其保存到新列中来应用功能

时间:2018-11-21 17:09:45

标签: r dataframe dplyr

R中具有以下df data.frame

调用df:

Id1 Id2   var1    var2
A  CODE_1 9625    0.110 
A  CODE_1 10625   0.210
A  CODE_2 3441    0.0604
A  CODE_2 22372   0.237
A  CODE_3 4611    0.0792
A  CODE_3 2859    0.0530
B  CODE_1 2295    0.0308
B  CODE_1 4398    0.0474
B  CODE_2 2464    0.0353
B  CODE_2 342     0.0596
B  CODE_3 2600    0.229
B  CODE_3 429     0.0762

我如何应用下一个功能:

myfun<- function(x,y,z,w){
  output <- list()
  output$den <- (x-z)/sqrt(((x*(1-x))/y)+((z*(1-z))/w))
  return(output)
}

并最终得到:

Id1 Id2    var1    var2   Val
A   CODE_1 9625    0.27   -16.1
A   CODE_1 8625    0.19   -16.1
A   CODE_2 3441    0.0604 -35.6
A   CODE_2 22372   0.237  -35.6
A   CODE_3 4611    0.0792  4.5
A   CODE_3 2859    0.0530  4.5
B   CODE_1 2295    0.0308  -3.440912
B   CODE_1 4398    0.0474  -3.440912
B   CODE_2 2464    0.0353  -1.82
B   CODE_2 342     0.0596  -1.82
B   CODE_3 2600    0.229   10.3
B   CODE_3 429     0.0762  10.3

代码本质上采用Id2和Id2,就像下面的手动过程一样:

A  CODE_1 9625    0.27   
A  CODE_1 8625    0.19   

并应用该函数,将结果按相应顺序保存在列中,如示例所示。

myfun(0.110,9625,0.19,8625)$den

A  CODE_1 9625    0.27   -16.1
A  CODE_1 8625    0.19   -16.1

目前我正在尝试一些方法,例如:

df %>% group_by(Id1, Id2)%>%select(var1, Var2)%>% xxxxxxx

我觉得xxxxxxx基本上是一条简单的线,但是我迷路了。.

1 个答案:

答案 0 :(得分:1)

我们可以修改功能

uni_prop.test <- function(x,y,z,w){  
    (x-z)/sqrt(((x*(1-x))/y)+((z*(1-z))/w))

  }

,然后按'Ti','Exp'分组后,通过将参数作为'var1'和'var2'的firstlast值来创建'var3'。在这里,我们假设每个组只有两个观测值(基于示例)

library(dplyr)
df %>% 
   group_by(Ti, Exp) %>% 
   mutate(var3 = uni_prop.test(first(var2), first(var1), last(var2), last(var1)))