在数据框中添加一个列名,该列名是文件名作为年份。

4

我是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个回答

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)

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

library(dplyr)
df = rbind_all(ldf)

@pascal 答案已被接受,我在周六点击了勾选标记。希望这样可以。 - oldtimetrad

1

我无法在@eipi10上面的答案中添加评论,所以我不得不在这里进行。我刚刚尝试了这个方法,它完美地解决了问题(感谢您-我会毫无头绪地搜索几个小时),但是收到了rbind_all已被弃用的消息。现在的dplyr解决方案是:

library(dplyr)
df = bind_rows(ldf)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接