在循环 R 中更改多个 csv 文件的变量名称

问题描述 投票:0回答:2

我是 R 新手,所以我对数据结构感到困惑。基本上我有 10 个 csv 文件,从 2011 年到 2021 年,分别命名为 kbr_year.csv。此 csv 文件包含数据框,我只想从数据框的列中检索数据。我想使用循环,以便我可以读取所有文件,然后将其作为字符附加。但是,我遇到了问题,因为代码不执行循环。

这是我如何一一阅读代码的:

text2021 <- read.csv2("kbr_2021.csv", header=TRUE, sep=";")
text2021_2 <- text2021[!duplicated(text2021$Full.context), ]
text2021_chr <- as.character(text2021_2["Full.context"])

这是我执行循环的方式,使用粘贴函数来确保文件名在循环执行时发生变化:

for (i in 2011:2021)
{
  k <- c()
  lk <- paste("kbr_", i, sep="")
  lk2 <- paste(lk, ".csv", sep="")
  t <- paste("text", i, sep="")
  t <- read.csv2(lk2, header=TRUE, sep=";")
  t <- t[!duplicated(t$Full.context), ]
  k <- as.character(t["Full.context"])
}

但是,我只读取了 1 个文件,而且是 2021 年的文件。

如何确保循环从 2011 年到 2021 年执行?

谢谢

我尝试使用paste()函数并循环执行它

for (i in 2011:2021)
{
  k <- c()
  lk <- paste("kbr_", i, sep="")
  lk2 <- paste(lk, ".csv", sep="")
  t <- paste("text", i, sep="")
  t <- read.csv2(lk2, header=TRUE, sep=";")
  t <- t[!duplicated(t$Full.context), ]
  k <- as.character(t["Full.context"])
}

但是没有成功

r loops paste
2个回答
0
投票

你的循环会像这样工作得更好,因为你在 for 循环的每次迭代开始时覆盖 k

k <- c()
for (i in 2011:2021)
{
  lk <- paste("kbr_", i, sep="")
  lk2 <- paste(lk, ".csv", sep="")
  t <- paste("text", i, sep="")
  t <- read.csv2(lk2, header=TRUE, sep=";")
  t <- t[!duplicated(t$Full.context), ]
  kNew <- as.list(as.character(t["Full.context"]))
  k <- c(k,kNew)
}

0
投票

我的猜测。

首先,一些可重复的样本数据。 (不需要种子,只需生成东西。)

# make fake data
for (yr in 2011:2021) {
  dat <- data.frame(Full.context = yr + sample(10), ignored = runif(10))
  write.csv2(dat, sprintf("kbr_%d.csv", yr))
}

现在我们有了一堆

.csv
文件,我们可以像这样读取它们:

list.files(pattern="kbr.*\\.csv$", full.names=TRUE) |>
  lapply(function(fn) {
    yr <- sub(".*_([0-9]+)\\.csv", "year_\\1", fn)
    x <- read.csv2(fn)[, "Full.context", drop=FALSE]
    names(x) <- yr
    x
  }) |>
  do.call(cbind, args = _)
#    year_2011 year_2012 year_2013 year_2014 year_2015 year_2016 year_2017 year_2018 year_2019 year_2020 year_2021
# 1       2021      2017      2020      2018      2022      2018      2020      2020      2021      2027      2024
# 2       2013      2014      2018      2015      2020      2025      2023      2027      2025      2029      2025
# 3       2020      2013      2016      2019      2021      2022      2021      2024      2029      2025      2022
# 4       2015      2015      2015      2016      2017      2026      2026      2026      2020      2028      2031
# 5       2014      2021      2023      2022      2024      2021      2024      2025      2023      2024      2026
# 6       2018      2022      2017      2017      2019      2024      2022      2022      2028      2021      2030
# 7       2017      2018      2022      2024      2025      2017      2025      2028      2026      2030      2028
# 8       2016      2016      2021      2021      2023      2020      2027      2021      2022      2023      2023
# 9       2019      2020      2014      2020      2018      2023      2019      2023      2024      2022      2027
# 10      2012      2019      2019      2023      2016      2019      2018      2019      2027      2026      2029

备注:

© www.soinside.com 2019 - 2024. All rights reserved.