我希望使用for循环创建多个数据框,然后将它们与merge()
拼接在一起。
我可以使用assign(paste(), blah)
创建数据框。但是,在同一个for循环中,我需要删除每个数据帧的第一列。
以下是我的代码的相关部分:
for (j in 1:3)
{
#This is to create each data frame
#This works
assign(paste(platform, j, "df", sep = "_"), read.csv(file = paste(masterfilename, extension, sep = "."), header = FALSE, skip = 1, nrows = 100))
#This is to delete first column
#This does not work
assign(paste(platform, j, "df$V1", sep = "_"), NULL)
}
在第一种情况下,我将变量分配给数据框,因此它们继承了该类型。但在第二种情况下,我将其分配给NULL
。
有没有人对如何解决这个问题有任何建议?此外,是否有比assign()
更优雅的解决方案,这似乎让我的代码陷入困境?谢谢,
n.i。
答案 0 :(得分:4)
assign
可用于构建变量名,但“name $ V1”不是变量名。 $
是R中的运算符,因此您尝试构建函数调用,而不能使用assign
执行此操作。事实上,在这种情况下,最好完全避免assign
。你不需要创建一堆不同的变量。如果data.frames是相关的,只需将它们保存在列表中即可。
mydfs <- lapply(1:3, function(j) {
df<- read.csv(file = paste(masterfilename, extension, sep = "."),
header = FALSE, skip = 1, nrows = 100))
df$V1<-NULL
df
})
现在,您可以使用mydfs[[1]]
,mydfs[[2]]
等访问它们。您可以使用任何*apply
系列函数运行整个data.sets函数。
答案 1 :(得分:1)
正如@joran在评论中指出的那样,正确的方法是使用列表。但是如果你想坚持assign
,你可以用
assign(paste(platform, j, "df", sep = "_"),
get(paste(platform, j, "df", sep = "_"))[
2:length(get(paste(platform, j, "df", sep = "_")))]
如果您想使用列表,则读取数据框的代码看起来像
dfs <- replicate(3,
read.csv(file = paste(masterfilename, extension, sep = "."),
header = FALSE, skip = 1, nrows = 100), simplify = FALSE)
请注意,您可以使用replicate
,因为您对read.csv
的调用不依赖于循环中的j
。然后,您可以删除每个
dfs <- lapply(dfs, function(d) d[-1])
或者,将所有内容组合在一个命令中
dfs <- replicate(3,
read.csv(file = paste(masterfilename, extension, sep = "."),
header = FALSE, skip = 1, nrows = 100)[-1], simplify = FALSE)