【问题标题】:Modifying a data.table to only include unique values of one variable修改 data.table 以仅包含一个变量的唯一值
【发布时间】:2019-12-30 21:46:23
【问题描述】:

我有一个想要修改的 data.table。 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”、“:=" 和点,我将不胜感激 =)

【问题讨论】:

标签: r data.table


【解决方案1】:

我们可以用getget 'var' 的值

dt[,unique(get(var)), by=var_list2] 

-全码

如果我们在函数中传递“数据”和其他参数,则无需在外部指定它(只是超出了函数的目的)

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

【讨论】:

  • 那里好像有很多重复的行?
  • @Helen 在这里,您的函数获取unique 元素,每组可以多于一个。例如cyl -6 and hp - 110 具有齿轮唯一值 4、3
  • 如果您需要使用列表作为列表列换行,或者使用字符串,请使用toString(unique(get(var)))
  • 对不起!我的意思是,如果我想要一个只有 «var» 唯一值的子集怎么办?
  • @Helen 它仅按组提供唯一值的子集,请检查您获得的值
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多