2016-03-05 64 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