【发布时间】:2016-05-05 20:26:31
【问题描述】:
我遇到了一个非常简单的问题,但还没有找到解决方法。我得到了来自不同商店的大约 200 张表,并且必须将整个数据体作为一个单元进行分析。由于表相当大,我正在使用data.table::fread。我的计划是加载每个表,rbind将它们放在一起并继续分析。为了保留哪个商店是哪个商店,我想为每个表添加一个变量 store,并带有商店的名称(与表相同)。为此,我计划使用表名运行 for 循环并创建新变量。
# I'll create some dummy data tables here. In reality they're loaded with fread
library(data.table)
centro <- data.table(x=letters[1:5], y = 1:5)
sur <- data.table(x=letters[2:7], y = 3:8)
...
norte <- data.table(x=letters[2:10], y = 3:11)
我需要每个表都有一个变量“store”,其值为“centro”、“sur”或“norte”,具体取决于它所属的商店。所以我尝试了:
st <- c("centro", "sur", "norte")
for (i in st){
i[, store := i]
}
当然,这不起作用(它抱怨“我不是 data.table”)。然后我尝试创建一个列表并通过lapply尝试:
sts <- list(centro, sur, norte)
sts <- lapply(sts, function(z) z[, store := names(z)])
这不起作用,因为names(z) 是“x”、“y”和“store”。
如何使用循环(或 *pply 函数)而不是手动执行 xyz[, store := "xyz"] 来做到这一点?
旁注
- 变量的命名几乎不可能调整,并且不遵循任何模式(不像 store_1、store_2 等)
- 我可能对我描述的替代方案有很大的偏见。任何其他可行的方法都可以。
【问题讨论】:
-
您的带有
i[, store := i]的代码块是不可重现的,i是一个字符标量,您正在使用[对其进行子集化,并尝试在内部使用:=。从那里开始。
标签: r data.table