提问人:Alexia k Boston 提问时间:7/14/2023 更新时间:7/20/2023 访问量:41
如何在输出csv中添加一个新列,其名称来自输入文件?
How to add a new column in output csv with name derived from input file?
问:
我有多个txt文件存储在不同的文件夹中。每个城市 1 个文件夹。每个 txt 文件以 5 分钟的间隔包含数据。我运行以下代码以成功获取每日数据。
for (idx in seq_along(dirlist)){
filelist <- list.files(path = dirlist[idx], full.names = TRUE, recursive = TRUE, pattern =
".txt$")
dt_ <- read_the_files(filelist)
dt.tidied <- adj_col_names(dt_)
#bind
merged <- rbindlist(dt.tidied, fill = TRUE, use.names = TRUE)
#Selecting the columns to be present in the output
selected_column <- c('YYmmdd', 'Temp', 'Pres')
#Calc daily avg
avg_dl <- merged %>%
group_by(YY_mm_dd = lubridate::floor_date(`YYmmdd`, "1 day")) %>%
summarise(across(where(is.numeric), ~ if(sum(is.na(.x)) > 5) NA else mean(.x, na.rm = TRUE))) %>%
write.csv(paste0(dirlist[idx],"_dl.csv"))
}
此代码为我提供了名为 CityName_dl.csv 的输出文件。例如,如果文件夹名称为 NYR,则其 txt 文件名将NYR_2020_01_01.txt,则每日平均输出文件将命名为 NYR_dl。
我想在上面的示例中添加一个新列,即City_Name到输出文件中,它应该包含输入文件名的第一个字母,例如所有行的 NYR。同样,文件夹“KAN”的输出文件将City_Name列填充为 KAN。我希望我已经很好地澄清了自己。如果有任何疑问,请告诉我。
我尝试使用cbind()但没有成功。谁能帮我解决这个问题。
答:
0赞
Mark
7/20/2023
#1
很难用你的答案创造一些东西,因为我没有你的数据,也不知道你的数据是什么样子的。因此,这是使用玩具数据帧执行此类操作的最小版本:
我有一个名为“words.txt”的文件,内容如下:
Hello
World
How
Are
You
然后,在另一个选项卡中,我有以下 R 代码:
df <- tibble(
x = 1:10
)
for (line in readLines("words.txt", warn = F)) {
df <- df %>%
mutate(!!line := !!line)
}
readLines
获取每一行单词 .txt,并使其成为字符向量,然后我可以循环访问它。生成的 DataFrame/Tibble 为:
# A tibble: 10 × 6
x Hello World How Are You
<int> <chr> <chr> <chr> <chr> <chr>
1 1 Hello World How Are You
2 2 Hello World How Are You
3 3 Hello World How Are You
4 4 Hello World How Are You
5 5 Hello World How Are You
6 6 Hello World How Are You
7 7 Hello World How Are You
8 8 Hello World How Are You
9 9 Hello World How Are You
10 10 Hello World How Are You
也就是说,如果你的文本文件只是一个城市名称列表,那么直接使用它:
for (city in cities) {
df$city_name <- city
}
或者使用索引(如 R2Evans 所提到的)是最简单和最容易的方法。cities[ind]
评论
City_Name
group_by
group_by(YY_mm_dd = lubridate::floor_date(
, "1 day"), City_Name = !!dirlist[idx])
City_Name = dirlist[idx]
!!