在 R 中调整函数的参数

  • 本文关键字:参数 函数 调整 r
  • 更新时间 :
  • 英文 :


如何将下面数据集中的所有XMR参数同时作为函数内的参数?

我可以这样做:

f1 <- function(X1,X2,X3,X4, XM1, XMR0, XMR01, XMR02, XMR03, XMR4){

x2<-df1 %>% select(starts_with("XMR"))
x2<-cbind(df1, setNames(df1$XM1 - x2, paste0(names(x2), "_PA")))
x3<-select(x2,X1,X2,X3,X4,XM1,ends_with("PA"))
return(x3)
}

然而,如果我有很多XMR,那么放几个XMR就不好了。有什么更简单的方法吗?

df1 <- structure(
list(
X1 = c(1, 1, 1, 1),
X2 = c("4","3","1","2"),
X3 = c("1", "2","3","2"),
X4 = c("1", "2","3","2"),
XM1 = c(200, 300, 200, 200),
XMR0 = c(300, 300, 300, 300),
XMR01 = c(300, 300, 300, 300),
XMR02 = c(300,300,300,300),
XMR03 = c(300,300,300,300),
XMR04 = c(300,250,350,350)),row.names = c(NA, 4L), class = "data.frame")

使用do.call会更容易(假设函数的参数与数据列的顺序相同(

do.call(f1, as.list(colnames(df1)))
X1 X2 X3 XM1 XMR0_PA XMR01_PA XMR02_PA XMR03_PA XMR04_PA
1  1  4  1 200    -100     -100     -100     -100     -100
2  1  3  2 300       0        0        0        0       50
3  1  1  3 200    -100     -100     -100     -100     -150
4  1  2  2 200    -100     -100     -100     -100     -150

该函数也可以写成

f2 <- function(data){ 

data %>% 
transmute(across(matches("^X\d+$")),
XM1, across(starts_with("XMR"), ~ XM1 - .x, 
.names = "{.col}_PA" )) 
}

然后我们使用

> f2(df1)
X1 X2 X3 XM1 XMR0_PA XMR01_PA XMR02_PA XMR03_PA XMR04_PA
1  1  4  1 200    -100     -100     -100     -100     -100
2  1  3  2 300       0        0        0        0       50
3  1  1  3 200    -100     -100     -100     -100     -150
4  1  2  2 200    -100     -100     -100     -100     -150

最新更新