我是 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"])
}
但是没有成功
你的循环会像这样工作得更好,因为你在 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)
}
我的猜测。
首先,一些可重复的样本数据。 (不需要种子,只需生成东西。)
# 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
备注:
drop=FALSE
是因为 访问列表或数据帧元素时括号 [ ] 和双括号 [[ ]] 之间的区别!duplicated(.)
可以很好地注入其中,我的假设是结果数据最终将具有相同的行数