首页 > 解决方案 > 自动化合并数据框添加一条线以记录原点

问题描述

我是 R 的新手。我有 6 个不同的数据框(U、V、W、X、Y、Z),来自不同的 CSV 文件,每个都有相同的列(姓氏、姓名、冬季、春季、夏季),我想创建一个新的数据框,其中包含 5 行和第六行,它指示原始数据来自的字母之一(U、V、...)。我尝试过使用以下代码:

U <- read.csv(file = "U", header = T)
V <- read.csv(file = "V", header = T)
W <- read.csv(file = "W", header = T)
X <- read.csv(file = "X", header = T)
Y <- read.csv(file = "Y", header = T)
Z <- read.csv(file = "Z", header = T)

U['class'] <- rep("U")
V['class'] <- rep("V")
W['class'] <- rep("W")
X['class'] <- rep("X")
Y['class'] <- rep("Y")
Z['class'] <- rep("Z")

students <- rbind(U, V, W, X, Y, Z)

我真的需要使用一个循环,这样我以后就可以从 A 到 Z。我想做这样的事情,这完全是胡说八道。

for(class.name in list(U, V, W, X, Y, Z)){
  class.name['class'] <- rep('class')
}

有没有合理的方法来做到这一点?

谢谢

已编辑

为了澄清我的问题,我的想法是我有 6 个不同的站点收集原始数据并给我 6 个不同的数据框。我想将它们合并在一起,维护原始数据来自哪个站点的信息。

可能不完整的解决方案 按照@MrFlick 的建议,我设法将所有内容放在一个列表中,如下所示

classes <- c('U', 'V', 'W', 'X', 'W', 'Z')
my.files <- paste(classes,".csv",sep="")
year.eight <- lapply(my.files, read.csv, header = T)
name(year.eight) <- classes

但是,最终结果应该是一个单独的数据框,并带有另一列以指示学生在哪个班级。有人可以帮我解决这个问题吗?

标签: r

解决方案


让我尝试分享一个例子

假设我们有 3 个文件A.csvB.csv并且C.csv在我们的工作目录中名为“data”的文件夹中。假设它们包含一个带有数值的列。然后这段代码做你想做的事。

library(readr)

files <- paste0("data/", list.files("data"))
df_list <- list()

for (i in seq_along(files)) {
  tmp <- read_csv(files[[i]])
  tmp["class"] <- sub("\\..*", "", basename(files[[i]])) # ".csv$" also works in this case
  df_list[[i]] <- tmp
}

output <- dplyr::bind_rows(df_list)
output
##  A tibble: 3 x 2
#       x class
#   <dbl> <chr>
# 1     1 A    
# 2     1 B    
# 3     1 C

根据Tensibai 的出色建议进行了编辑。


推荐阅读