【问题标题】:Lapply over data table and variable name覆盖数据表和变量名
【发布时间】:2015-10-20 21:14:22
【问题描述】:

我正在尝试将多个数据表中的多个变量(每个数据表一个变量)从一个数字转换为一个因子。这是我到目前为止的代码(不工作):

DT = data.table(x=c(1,2,3,4), y = c(8,9,10,11), n = c(1,0,1,0))
DT
   x  y n
1: 1  8 a
2: 2  9 a
3: 3 10 b
4: 4 11 b

var_list = list("x","y")

lapply(var_list, function(i) {
  name1 = paste("factor", i, sep="_")
  DT[, num := seq_len(.N), by = "n"]
  dataname = paste("DT",i,sep="_")
  assign(dataname, data.frame(subset(DT,num==1)),pos = .GlobalEnv)
  dataname = data.table(dataname)
  dataname[, name1 := as.factor(get(i)), with = FALSE]
})  

get(i) 中的错误:找不到对象“x”

我错过了什么?

【问题讨论】:

  • dataname 是一个字符串,所以data.table(dataname) 只是一个 data.table,其中一个字符串作为其唯一的数据点(观察/行和变量/列)。
  • 您的代码对我来说似乎很模糊。你能显示所需的输出吗?在我看来,您只需要var_list = c("x","y") ; DT[, (var_list) := lapply(.SD, factor), .SDcols = var_list]
  • 好的@Frank 给了我我需要的东西。谢谢!我将在下面发布解决方案。
  • @gannawag 很高兴您找到了解决方法,但您应该知道,正如大卫所说,可能有更直接的方法可以实现您的目标,assign 是代码的症状,它将创建以后麻烦你了。查看 data.table 小插曲可能是开始学习更好的替代方案的好方法:github.com/Rdatatable/data.table/wiki/Getting-started
  • @Frank 谢谢,我去看看。

标签: r data.table lapply


【解决方案1】:
lapply(var_list, function(i) {
  name1 = paste("factor", i, sep="_")
  DT[, num := seq_len(.N), by = "n"]
  dataname = paste("DT",i,sep="_")

我试图在单独的行中将 dataname 转换为 data.table,但它正在转换为 1x1 data.table。相反,在分配行中转换为 data.table:

  assign(dataname, data.table(subset(DT,num==1)),pos = .GlobalEnv)

然后在[]外使用get()函数引用dataname data.table

  get(dataname)[, (name1) := as.factor(get(i))]
}) 

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2012-12-29
    • 1970-01-01
    • 2020-07-03
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2017-02-25
    相关资源
    最近更新 更多