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(:=)运算符,这使事情变得更简洁了,但是每个列名称仍然必须出现两次,并且该函数对于每个列必须出现一次。
简明的方式是Map与输入参数作为数据集(“DF”)和list的vector,将作为参数传递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)