使用每列使用不同参数的函数转换多列

Eme*_*son 3 r dataframe data.table

我编写并回顾了大量的R代码,如下所示:

df <- data.frame(replicate(10, sample(0:5, 10, rep = TRUE)))
my.func <- function(col, y) {col %in% y}

df$X2 <- my.func(df$X2, c(1,2))
df$X3 <- my.func(df$X3, c(4,5))
df$X5 <- my.func(df$X5, c(1,2))
df$X6 <- my.func(df$X6, c(4,5))
df$X8 <- my.func(df$X8, c(4,5))
df$X9 <- my.func(df$X9, c(1,2))
df$X10 <- my.func(df$X10, c(1))
Run Code Online (Sandbox Code Playgroud)

也就是说,使用函数对data.frame(或data.table)中的某些列进行了转换,其中一个参数是一个列,另一个参数是某个任意的,对该列而言有点唯一的值。

进行这种转换的更简洁的方法是什么?

我已经尝试过使用data.table的set(:=)运算符,这使事情变得更简洁了,但是每个列名称仍然必须出现两次,并且该函数对于每个列必须出现一次。

akr*_*run 8

简明的方式是Map与输入参数作为数据集(“DF”)和listvector,将作为参数传递my.func。在这里,data.frame的每一列都是a,unit并且类似地是来自的向量元素list

df[] <- Map(my.func, df, list(1:2, 4:5, 3:4))
Run Code Online (Sandbox Code Playgroud)

注意:未提供OP的功能或最小的可复制示例,因此未经测试

注2:在这里,假设是列数为3。如果是超过3个,增加的长度list以及


上面也可以转换成data.table语法

library(data.table)
setDT(df)[, names(df) := Map(my.func, .SD, list(1:2, 4:5, 3:4))]
Run Code Online (Sandbox Code Playgroud)

如果仅需要更改列的子集,请在中指定列.SDcols,然后将更names(df)改为名称的子集


或搭配 tidyverse

library(tidyverse)
map2_dfc(df, list(1:2, 4:5, 3:4), my.func)
Run Code Online (Sandbox Code Playgroud)