一種選擇可能是將數據轉換成第一利用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,也許有人會來,並解釋如何做到這一點,但希望這是有用的。