2016-03-05 97 views
0

我开始使用dplyr,我想投我的老plyr程序dplyr 我有此列的数据帧:dplyr自定义函数

model,label, value0,value1,value2..... , value100 

我想用dplyr,以增加新列rms其运行调用value0看重100这个功能rms

rms <- function(value){ 
    rms = sqrt(sum(value^2))/sqrt(length(value)) 
    return (rms) 
} 

我怎么能说发生变异之内我的输入参数的输入参数。

table %>% 
    rowwise() %>% 
    mutate(rms= rms(???) 

预先感谢

回答

0

一种选择可能是将数据转换成第一利用tidyr gather长格式。这将允许您将您的功能应用于单个列。一个简单的例子

library(dplyr) 
library(tidyr) 

df <- data.frame(model = c("Model1", "Model2", "Model3"), 
       label = c("Label1", "Label2", "Label3"), 
       value0 = c(1, 2, 3), 
       value1 = c(4, 5, 6), 
       value2 = c(7, 8, 9), 
       stringsAsFactors = FALSE) 

long_df <- df %>% 
    gather(value_name, value, -model, -label) 

model label value_name value 
1 Model1 Label1  value0  1 
2 Model2 Label2  value0  2 
3 Model3 Label3  value0  3 
4 Model1 Label1  value1  4 
5 Model2 Label2  value1  5 
6 Model3 Label3  value1  6 
7 Model1 Label1  value2  7 
8 Model2 Label2  value2  8 
9 Model3 Label3  value2  9 

现在你可以应用你的函数来为每个模型和标签组创建一个rms值。

rms <- function(value){ 
    rms = sqrt(sum(value^2))/sqrt(length(value)) 
    return(rms) 
} 

rms_df <- long_df %>% 
    group_by(model, label) %>% 
    summarise(rms = rms(value)) 

现在加入rms_df回到原来的DF和宾果游戏,你有一个有效值列。

df <- df %>% 
    left_join(rms_df) 

    model label value0 value1 value2  rms 
1 Model1 Label1  1  4  7 4.690416 
2 Model2 Label2  2  5  8 5.567764 
3 Model3 Label3  3  6  9 6.480741 

不使用rowwise,也许有人会来,并解释如何做到这一点,但希望这是有用的。

0

谢谢您的建议。 很高兴,我想到了这个解决方案,但通过了Reshape pakage。

我肯定是dplyr ,如果我做一个解决方案:

table %>% 
    rowwise() %>% 
    mutate(rms= rms(c(Frame0,Frame2)) 

我可以在帧0和帧2.运行我的功能,但如果我用C失败(“帧0”,“帧2 “)

我想要一个完整的dplyr解决方案。 欢呼声

0

好的,我不确定Frame0和Frame2是什么,但是这里有一个稍微改变的方法来解决加入的问题。再次使用我编造的DF。

df <- data.frame(model = c("Model1", "Model2", "Model3"), 
       label = c("Label1", "Label2", "Label3"), 
       value0 = c(1, 2, 3), 
       value1 = c(4, 5, 6), 
       value2 = c(7, 8, 9), 
       stringsAsFactors = FALSE) 

我们使用tidyr::gather的DF转换为长格式,然后应用你的函数一列,然后用tidyr::spread将其转换回宽格式。 Tidyr和dplyr是为了一起工作,所以我认为你从“完整的解决方案”中获益不多。

rms_df <- df %>% 
    gather(value_name, value, -model, -label) %>% 
    group_by(model, label) %>% 
    mutate(rms = rms(value)) %>% 
    spread(value_name, value) 

> rms_df 
Source: local data frame [3 x 6] 
    model label  rms value0 value1 value2 
    (chr) (chr) (dbl) (dbl) (dbl) (dbl) 
1 Model1 Label1 4.690416  1  4  7 
2 Model2 Label2 5.567764  2  5  8 
3 Model3 Label3 6.480741  3  6  9