如何在输出csv中添加一个新列,其名称来自输入文件?

How to add a new column in output csv with name derived from input file?

提问人:Alexia k Boston 提问时间:7/14/2023 更新时间:7/20/2023 访问量:41

问:

我有多个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()但没有成功。谁能帮我解决这个问题。

r csv data.table tidyr rbind

评论

1赞 Andre Wildberg 7/14/2023
添加 to 就足够了,例如像 YYmmdd 这样的东西。确切的代码取决于 dirlist 等的类。City_Namegroup_bygroup_by(YY_mm_dd = lubridate::floor_date(, "1 day"), City_Name = !!dirlist[idx])
1赞 r2evans 7/14/2023
为什么不只是 ?不需要,它不是间接引用。City_Name = dirlist[idx]!!

答:

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]