我是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并将其添加为具有值的列? 任何帮助将不胜感激。
答案 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)