首页 > 解决方案 > 如何在R的列中插入文件名

问题描述

假设,我有这样的文件

rock=structure(list(x1 = c(0, 0.8, 0.4, 0.3, 0.5, 1, 0.7, 0.6, 0.4, 
0.4, 0.6), x2 = c(0, 1, 0.5, 0.3, 0.5, 0.5, 0.8, 0.3, 0.6, 0.8, 
0.7), x3 = c(0, 0.4, 0.8, 0.4, 0.2, 1, 0.5, 0.8, 0.4, 1, 0.3), 
    x4 = c(0, 0.3, 0.4, 0.4, 0.5, 0.6, 0.8, 0.3, 0.7, 0.6, 0.2
    )), class = "data.frame", row.names = c(NA, -11L))
rave=structure(list(x1 = c(0, 0.8, 0.4, 0.3, 0.5, 1), x2 = c(0, 1, 
0.5, 0.3, 0.5, 0.5), x3 = c(0, 0.4, 0.8, 0.4, 0.2, 1), x4 = c(0, 
0.3, 0.4, 0.4, 0.5, 0.6)), class = "data.frame", row.names = c(NA, 
-6L))
classic=structure(list(x1 = c(0, 0.8), x2 = 0:1, x3 = c(0, 0.4), x4 = c(0, 
0.3)), class = "data.frame", row.names = c(NA, -2L))

当我使用这些数据集时如何做到这一点rbind,为每个数据集粘贴原始名称,即我希望看到这样的结果。名称为 csv 格式的初始数据。例如

classic=read.csv(path to classic.csv)

   dataset  x1  x2  x3  x4
1  classic 0.0 0.0 0.0 0.0
2  classic 0.8 1.0 0.4 0.3
3     Rave 0.0 0.0 0.0 0.0
4     Rave 0.8 1.0 0.4 0.3
5     Rave 0.4 0.5 0.8 0.4
6     Rave 0.3 0.3 0.4 0.4
7     Rave 0.5 0.5 0.2 0.5
8     rock 0.0 0.0 0.0 0.0
9     rock 0.8 1.0 0.4 0.3
10    rock 0.4 0.5 0.8 0.4
11    rock 0.3 0.3 0.4 0.4
12    rock 0.5 0.5 0.2 0.5
13    rock 1.0 0.5 1.0 0.6
14    rock 0.7 0.8 0.5 0.8
15    rock 0.6 0.3 0.8 0.3
16    rock 0.4 0.6 0.4 0.7
17    rock 0.4 0.8 1.0 0.6
18    rock 0.6 0.7 0.3 0.2

标签: rdplyr

解决方案


将它们放在一个列表中并使用bind_rows

library(dplyr)
bind_rows(lst(rock, rave, classic), .id = 'dataset')

#   dataset  x1  x2  x3  x4
#1     rock 0.0 0.0 0.0 0.0
#2     rock 0.8 1.0 0.4 0.3
#3     rock 0.4 0.5 0.8 0.4
#4     rock 0.3 0.3 0.4 0.4
#5     rock 0.5 0.5 0.2 0.5
#6     rock 1.0 0.5 1.0 0.6
#7     rock 0.7 0.8 0.5 0.8
#8     rock 0.6 0.3 0.8 0.3
#9     rock 0.4 0.6 0.4 0.7
#10    rock 0.4 0.8 1.0 0.6
#11    rock 0.6 0.7 0.3 0.2
#12    rave 0.0 0.0 0.0 0.0
#13    rave 0.8 1.0 0.4 0.3
#14    rave 0.4 0.5 0.8 0.4
#15    rave 0.3 0.3 0.4 0.4
#16    rave 0.5 0.5 0.2 0.5
#17    rave 1.0 0.5 1.0 0.6
#18 classic 0.0 0.0 0.0 0.0
#19 classic 0.8 1.0 0.4 0.3

但是,如果您可以自动读取列表中的数据而无需先单独读取它们,那会更好。

library(dplyr)
library(purrr)

filenames <- list.files('/path/to/csv', pattern = '\\.csv', full.names = TRUE)

result <- map_df(filenames, 
                 ~read.csv(.x) %>% 
                   mutate(dataset = tools::file_path_sans_ext(basename(.x))))

推荐阅读