我的數據是這樣的:意外的值,而在dplyr應用自定義功能::變異
library(tidyverse)
df <- tribble(
~y_val, ~z_val,
2, 4,
5, 3,
8, 2,
1, 1,
9, 3)
我有自定義函數fun_b()
,我想申請到了dplyr ::發生變異的呼叫數據幀。然而,fun_b()
使用功能fun_a()
它有它內部的一個循環:
fun_a <- function(x, y, z, times = 1) {
df <- data.frame()
for (i in 1:times) {
x <- x * 2 + i * x
y <- y/3 + i * y
z <- z + 1 + z * i
d <- data.frame(x, y, z)
df <- rbind(df, d)
}
return(df)
}
fun_b <- function(x, y, z, times = 1) {
df <- fun_a(x, y, z, times)
x_r <- sum(df$x)
y_r <- sum(df$y)
z_r <- sum(df$z)
val <- x_r/y_r * z_r
return(val)
}
當我運行自定義功能:
df %>%
mutate(test = fun_b(x = 1, y = y_val, z = z_val, times = 1))
在test
每個突變值顯示相同的值(13.95)。這沒有道理!例如,蹣跚(y_val = 2, z_val = 4)
的第一行應該是10.125!
fun_b(x = 1, y = 2, z = 4, times = 1)
這是怎麼回事?
你只需要組或者只是取出'sum'調用,這樣你的行爲就會變成行,即'df%>%rowwise()%>% mutate(test = fun_b(x = 1,y = y_val,z = z_val,times = 1)功能是可以矢量化的 – alistaire