我想在每列中添加一个包含年份(在文件名中找到)的列。我花了几个小时在谷歌搜索,但无法让它工作。我做了一些简单的错误吗?
从概念上讲,我正在制作文件列表,然后使用lapply计算列表中每个文件的列。
我正在使用人口普查OnTheMap.全新下载的数据。所有文件都这样命名:“points_2013”“points_2014”等。使用以下代码读取数据:
library(maptools)
library(sp)
shps <- dir(getwd(), "*.shp")
for (shp in shps) assign(shp, readShapePoints(shp))
# the assign function will take the string representing shp
# and turn it into a variable which holds the spatial points data
我的问题与this one非常相似,只是我没有文件名列表 - 我只想从文件名中提取一列中的条目。 This thread有一个问题,但没有答案。 This person尝试使用[[而不是$,没有运气。 This似乎意味着错误可能在cbind与rbind之间。不确定。我不是想输出到csv,所以this并不完全相关。
This几乎就是我想做的事情。将该示例中的代码调整为我的目的会产生以下结果:
dat <- ls(pattern="points_")
dat
ldf = lapply(dat, function(x) {
# Add a column with the year
dat$Year = substr(x,8,11)
return(dat)
})
ldf
points_2014.shp$Year
但是最后一行仍然返回NULL!
从this thread开始,我调整了他们的解决方案。省略do.call和rbind,这似乎有效:
lapply(points,
function(x) {
dat=get(x)
dat$year = sub('.*_(.*)$','\\1',x)
return(dat)
})
points_2014.shp$year
但最后一行返回null。
开始怀疑我的R在某种程度上是否有问题。我使用this example对它进行了测试,但它确实有效,所以问题出在其他地方。
# a dataframe
a <- data.frame(x = 1:3, y = 4:6)
a
# make a list of several dataframes, then apply function
#(change column names, e.g.):
my.list <- list(a, a)
my.list <- lapply(my.list, function(x) {
names(x) <- c("a", "b")
return(x)})
my.list
在本网站的一些帮助下,我的最终代码是:
#-------takes all the points files, adds the year, and then binds them together
points2<-do.call(rbind,lapply(ls(pattern='points_*'),
function(x) {
dat=get(x)
dat$year = substr(x,8,11)
dat
}))
points2$year
names(points2)
然而,它确实使用了rbind,这在短期内很有用。从长远来看,我需要再次拆分它,并使用一个cbind,所以我可以相互减去两列。
答案 0 :(得分:2)
我使用以下代码:
for (i in names.of.objects){
temp <- get(i)
# do transformations on temp
assign(i, temp)
}
这是有效的,但绝对不是高效的,因为它通过值方式在调用中两次分配整个数据。