我有一个数据表,我想修改一下。data.table 有许多列,其中n个我感兴趣,让我们说在这个例子中,来自 mtcars 的"cyl"、"hp"和"gear"很有趣。我想创建一个只有这三列的新数据表,其中只有三列之一的唯一值的行。这是我到目前为止所拥有的:
dt <- data.table(data)[, .(cyl, gear, hp)]
dt[,unique(gear),by=.(cyl,hp)]
dt[,!duplicated(dt[,gear])
有没有更好的方法来做到这一点,有人可以帮助我了解如何将其变成一个函数,在其中指定数据和感兴趣的变量?到目前为止我的尝试:
fun_plot_gam <- function(data,var,var_list){
var_list = c("cyl","gear","hp")
var = "gear" #variable I'm interested in
var_list2 = var_list[which(var_list != var)]
dt <- data.table(mtcars)[, var_list, with=FALSE]
dt[,unique(var), by=var_list2,with=FALSE] #problem line
dt[,!duplicated(dt[,var])]
return(dt)
}
似乎我没有正确理解 data.table 来制作一个函数。如果有人能指导我快速了解何时在操作 data.tables 的函数中使用"get"、":="和点,我将不胜感激 =(
我们可以用get
get
'var' 的值
dt[,unique(get(var)), by=var_list2]
-完整代码
如果我们在函数中传递"data"和其他参数,则无需在函数外部指定它(只是击败函数的目的(
fun_plot_gam <- function(data,var,var_list){
# get the vector of column names that are not in the 'var'
var_list2 <- setdiff(var_list, var)
# convert to data.table, subset the columns
dt <- as.data.table(data)[, var_list, with=FALSE]
# get the `unique` elements of column specified in 'var'
# grouped by 'var_list2' columns
dt1 <- dt[, unique(get(var)), by=var_list2]
setnames(dt1, ncol(dt1), var)
dt1
}
fun_plot_gam(mtcars, var, var_list)
# cyl hp gear
# 1: 6 110 4
# 2: 6 110 3
# 3: 4 93 4
# 4: 8 175 3
# 5: 6 105 3
# 6: 8 245 3
# 7: 4 62 4
# 8: 4 95 4
# 9: 6 123 4
#10: 8 180 3
#11: 8 205 3
#12: 8 215 3
#13: 8 230 3
#14: 4 66 4
#15: 4 52 4
#16: 4 65 4
#17: 4 97 3
#18: 8 150 3
#19: 4 91 5
#20: 4 113 5
#21: 8 264 5
#22: 6 175 5
#23: 8 335 5
#24: 4 109 4