我正在尝试编写一些引用包含用户定义函数的数据框列的代码,并将该函数应用于包含原始数据的相邻列。
具体来说,我想应用存储在 A 列中的用户定义函数,并将其应用于给定行的 C 列。
示例:
#Create user-defined functions
TF_01 <- function(x) { return (x^2)}
TF_02 <- function(x) { return (x^3)}
#Create a, b, c variables
A <- c("8_FAM","8_FAM","8_FAM","8_FAM","13_FAM","13_FAM","13_FAM","13_FAM")
B <- c(TF_01,TF_01,TF_01,TF_01,TF_02,TF_02,TF_02,TF_02)
C <- c(32.2,31.9,32.8,31.6,32.9,34.6,32.7,32.4)
#Join variables as data frame
df <- data.frame (A,B,C)
我能够对特定函数进行硬编码,但我需要灵活地应用任何用户定义的函数。
您的 columnB 不是函数列,而是包含您需要的函数名称的列。考虑使用
match.fun
来调用这些函数:
transform(df, D = mapply(\(x, y)match.fun(x)(y), B, C))
A B C D
1 8_FAM TF_01 32.2 1036.84
2 8_FAM TF_01 31.9 1017.61
3 8_FAM TF_01 32.8 1075.84
4 8_FAM TF_01 31.6 998.56
5 13_FAM TF_02 32.9 35611.29
6 13_FAM TF_02 34.6 41421.74
7 13_FAM TF_02 32.7 34965.78
8 13_FAM TF_02 32.4 34012.22
cbind(df, D = mapply(\(x,y)x(y), mget(df$B), df$C))
在基础 R 中,您可以创建一个新列作为现有列的函数,如下所示:
mtcars$new <- sqrt(mtcars$mpg)
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb new
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 4.582576
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 4.582576
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 4.774935
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 4.626013
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 4.324350
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 4.254409