【问题标题】:Keeping only a list of certain columns in a very robust dataset?在一个非常健壮的数据集中只保留某些列的列表?
【发布时间】:2015-11-19 04:48:30
【问题描述】:

我正在尝试用一些纵向数据做一些事情:

1) 将几年的数据合并到一张表中 例如

data1996.csv,
data1997.csv,
...,
data2013.csv

2) 定义要保留的变量列表

3) 删除所有与 Keepers 列表不匹配的列 4) 将结果数据集写入 CSV 文件

require(data.table)
setwd("~/my/directory")

定义文件路径的名称

paths <- list()

列出我要聚合的文件

for(i in 0:17) 
{
  paths[i]<- paste("MERGED",1996+i,"_PP.csv",sep="")
}

定义要保留的变量列表

keeps <- list(
  "CITY",
  "ZIP",
  "LONGITUDE",
  "LATITUDE",
   ...
)

对路径列表中的所有文件运行 fread

out <- rbindlist(lapply(paths, fread), use.names=TRUE)

由于某种原因 typeof(out) 返回列表

这是我尝试删除除“保留”中的列之外的所有列的地方

filteredOut <- out[,keeps,drop=FALSE]

但它只是给了我一个我想要保留的 28 个变量的列表

我也试过这个:

filteredOut <- out[keeps]

但我收到此错误:

  Error in `[.data.table`(out, keeps) : 
  When i is a data.table (or character vector), x must be keyed (i.e. sorted, and, marked as sorted) so data.table knows which columns to join to and take advantage of x being sorted. Call setkey(x,...) first, see ?setkey.
    write.table(filteredOut, "testing.csv", sep=",")

我的脚本似乎成功地结合了 17 年的数据(我最终得到了 'out',它在 1729 个变量中有 117905 个 obs)

之后,我想保存到 csv:

write.table(filteredOut, "myfile.csv", sep=",")

我也收到警告,其中超过 50 个,但它们似乎认为是 NULL 值。我遇到的问题是 1)理解数据类型(list、data.frame、data.table)和 2)实现 drop 命令的正确方法

非常感谢任何和所有帮助!

【问题讨论】:

  • 关于list 类型问题,请记住data.frame 只是list,其中每个列表项的长度相同。见is.list(data.frame(a=1))unclass(data.frame(a=1,b=2))

标签: r data.table


【解决方案1】:

我们可以unlist 'keeps',并使用with=FALSE 对列进行子集化。

out[, unlist(keeps), with=FALSE]

【讨论】:

  • 谢谢!这行得通!我完全忘记了一些事情——在组合这些 csv 时,我忘记用 YEAR 创建一个列。也许在我的 for 循环中我可以做到。在聚合这些 CSV 时,您建议添加 YEAR 变量的最简单方法是什么?再次感谢您及时而简洁的帮助
  • @nAguirre 你有YEAR 作为向量还是在其他数据集中?如果是向量out[, unlist(keeps), with=FALSE][, YEAR:= YEAR]
  • YEAR 不存在,我必须使用 (i+1996) 将其添加到 for 循环中。我不认为我必须逐行执行此操作?但我不知道怎么回事。也许我可以在 lapply 中传递一个函数,它将年份设置为路径索引为 + 1996 的任何值??
  • @nAguirre 我可以假设您想从文件名中提取 YEAR,即data1996.csv
  • @nAguirre 我想你需要的是files &lt;- list.files(pattern='\\.csv'); out &lt;- rbindlist(lapply(files, fread) , idcol='Grp'); nm1 &lt;- gsub('\\D+', '', files); out[, unlist(keeps), with=FALSE][, YEAR:= nm1[as.numeric(Grp)]](未测试)
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2021-06-28
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多