在 R 中给定的数据帧行中,我想在一个单元格中识别用户定义的函数,然后应用于相邻单元格

问题描述 投票:0回答:2

我正在尝试编写一些引用包含用户定义函数的数据框列的代码,并将该函数应用于包含原始数据的相邻列。

具体来说,我想应用存储在 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)

我能够对特定函数进行硬编码,但我需要灵活地应用任何用户定义的函数。

r dataframe transform user-defined-functions flexibility
2个回答
1
投票

您的 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))


0
投票

在基础 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
© www.soinside.com 2019 - 2024. All rights reserved.