将作为年份的文件名的列名称添加到数据框

时间:2014-10-13 15:17:07

标签: r

我是R.的新手。我的本地电脑上的目录中有多个文件。我已将它们导入R并添加了列名,如下所示。现在我需要将年份添加到与文件名对应的每个数据框。例如,第一个文件被称为1950年第二个1951年,依此类推。如何在R?

中将年份添加为具有这些值的列名称
The output is below
  Name Sex Number
 1    Linda   F     10
 2     Mary   F    100
 3  Patrick   M    200
 4  Barbara   F    300
 5    Susan   F    500
 6  Richard   M    900
 7  Deborah   F    500
 8   Sandra   F     23
 9    Conor   M     15
 10   Conor   F    120

我需要在此文件开头的另一列?

这是我生成上述内容的代码。

ldf <- list() # creates a list
listtxt <- dir(pattern = "*.txt") # creates the list of all the txt files in the directory
#Year = 1950
for (k in 1:length(listtxt)) #1:4  4 is the length of the list 
{
  ldf[[k]] <- read.table(listtxt[k],header=F,sep=",")
  colnames(ldf[[k]]) = c('Name', 'Sex', 'Number')
  #test = cbind(ldf[[k]], Year )

}

我需要每年为每个文件增加1并将其添加为具有值的列? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

您可以通过直接从文件名获取年份来添加包含年份的列。我还使用了lapply而不是循环来遍历每个文件。

在下面的代码中,该函数读取单个文件,并添加一个包含该文件年份的列。由于您的文件名在名称中包含年份,因此您只需使用substr从文件名中获取年份。 lapply将函数应用于listtxt中的每个文件名,从而生成一个列表,其中每个元素都是数据框。然后,您只需rbind将所有列表元素放入单个数据框中。

ldf = lapply(listtxt, function(x) {

      dat = read.table(x, header=FALSE, sep=",")

      # Add column names
      names(dat) = c('Name', 'Sex', 'Number')

      # Add a column with the year
      dat$Year = substr(x,1,4)

      return(dat)
})

# Combine all the individual data frames into a single data frame
df = do.call("rbind", ldf)

您可以使用do.call("rbind", ldf)包中的rbind_all代替dplyr,如下所示:

library(dplyr)
df = rbind_all(ldf)

答案 1 :(得分:1)

我无法在上面的@ eipi10回答中添加评论,所以我必须在这里做。我只是尝试了这个并且它工作得很好(谢谢 - 我搜索了几个小时没有运气)但得到了rbind_all被弃用的消息。 dplyr解决方案现在是:

library(dplyr)
df = bind_rows(ldf)