在将多个文件读入单个数据框时,为每个文件创建自定义列

时间:2012-11-21 21:25:25

标签: r file csv dataframe plyr

  

可能重复:
  When importing CSV into R how to generate column with name of the CSV?

我收到了一些我想要加载到单个数据框中的文件。我正在阅读的每个文件都具有相同的结构,但行数不同。假设每个文件代表一个参与者,我知道我可以使用下面的代码阅读它们:

files <- c("john.csv","fred.csv","nick.csv","alex.csv")
library(plyr)
dfoc <- ldply(files, read.csv, header = T)

现在,我希望能够识别哪些行属于哪个参与者。我想在将它们读入大数据帧之前为每个文件添加一个列。我要添加的列将具有等于特定参与者nrow(john)的行数的行数。我添加的列应该只包含一个标识符,例如重复nrow(x)次的文件名。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

这是我要做的。 (关键的想法是将id列的值和刚读入的data.frame放在一起调用data.frame() .R的回收规则将生成id列在每种情况下都有正确的长度。)

## Set up a reproducible example
a <- tempfile()
b <- tempfile()
write.csv(head(mtcars, 2), file=a)
write.csv(tail(mtcars, 3), file=b)
fnames <- c(a,b)

## Here's the code you are looking for
do.call(rbind, lapply(fnames, function(X) {
    data.frame(id = basename(X), read.csv(X))})
)
#                 id             X  mpg cyl disp  hp drat    wt  qsec vs am gear carb
# 1 file104862dd45aa     Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# 2 file104862dd45aa Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# 3  file1048d9e5764  Ferrari Dino 19.7   6  145 175 3.62 2.770 15.50  0  1    5    6
# 4  file1048d9e5764 Maserati Bora 15.0   8  301 335 3.54 3.570 14.60  0  1    5    8
# 5  file1048d9e5764    Volvo 142E 21.4   4  121 109 4.11 2.780 18.60  1  1    4    2