一种选择可能是将数据转换成第一利用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,也许有人会来,并解释如何做到这一点,但希望这是有用的。