首页 > 解决方案 > 在 R 中 - 将一行数据迭代地添加到多个文件中

问题描述

我有一个名为“HUCs”的文件夹,其中包含 2100 个文件,每个文件都以首字母缩写词和数字命名。每个文件中有三列数据,长度相同,标题相同。我有另一个名为“means”的文件 2100 rows。每个row对应file于 HUCs 文件夹中的一个,并相应地命名。

例如,“means”中的 A2 行包含“1010001”(其名称),B2 包含均值数据。“1010001”行数据对应于 HUCs 文件夹中名为“mricgcm_1010001”的文件。

我需要以某种方式一次从“means”文件中复制每一行,并将数据(行中的三个单元格)放入其对应文件的新列范围中。因此,HUCs 文件中的当前数据位于 A/B/C 列中,新的“均值”数据可以放入 D/E/F(或某些分隔的等效项)中。

如果只有 2100 个文件的一个文件夹,我会考虑手动完成。但我有几个类似的文件夹。我什至无法思考如何解决这个问题。这在R中可能吗?我尽力了,但请询问是否需要进一步解释。

这是 HUC 文件列表的开头:

mricgcm_1010002.csv
mricgcm_1010003.csv
mricgcm_1030001.csv
mricgcm_1040001.csv
mricgcm_1040002.csv
mricgcm_1050001.csv
mricgcm_1050002.csv
mricgcm_1070002.csv
mricgcm_1080107.csv
mricgcm_1080204.csv
mricgcm_1090003.csv
mricgcm_1100001.csv
mricgcm_1100002.csv
mricgcm_1100003.csv
mricgcm_1200001.csv

这是“手段”文件中的工作表:

HUC     Means
1010002 141.0727273
1010003 148.6072727
1030001 158.3327273
1040001 181.1127273
1040002 222.78
1050001 163.4818182
1050002 231.9272727
1070002 201.5018182
1080107 183.0545455
1080204 197.3836364
1090003 209.14
1100001 193.0472727
1100002 186.1963636
1100003 199.2854545
1200001 1.021818182

这是 HUCs 文件现在包含的内容:

HUC             Year    Predicted
mricgcm_1010002 1961    10.8
mricgcm_1010002 1962    4.6
mricgcm_1010002 1963    0.8
mricgcm_1010002 1964    66.3
mricgcm_1010002 1965    20.4
mricgcm_1010002 1966    8.5
mricgcm_1010002 1967    13.5
mricgcm_1010002 1968    3.7
mricgcm_1010002 1969    59.2
mricgcm_1010002 1970    13.8
mricgcm_1010002 1971    5.5
mricgcm_1010002 1972    1.9
mricgcm_1010002 1973    9.9
mricgcm_1010002 1974    11.7
mricgcm_1010002 1975    52.4

这就是我想要的结果示例,对于每个文件:

HUC             Year    Predicted HUC       Mean
mricgcm_1010002 1961    10.8      1010002   141.0727273
mricgcm_1010002 1962    4.6                 141.0727273
mricgcm_1010002 1963    0.8                 141.0727273
mricgcm_1010002 1964    66.3                141.0727273
mricgcm_1010002 1965    20.4                141.0727273
mricgcm_1010002 1966    8.5                 141.0727273
mricgcm_1010002 1967    13.5                141.0727273
mricgcm_1010002 1968    3.7                 141.0727273
mricgcm_1010002 1969    59.2                141.0727273
mricgcm_1010002 1970    13.8                141.0727273
mricgcm_1010002 1971    5.5                 141.0727273
mricgcm_1010002 1972    1.9                 141.0727273
mricgcm_1010002 1973    9.9                 141.0727273
mricgcm_1010002 1974    11.7                141.0727273
mricgcm_1010002 1975    52.4                141.0727273

注意,FTR:平均值不是预测数据列的平均值,否则我可以在该列上运行平均值公式。它是从其他地方获得的历史数据的平均值。

这就是我现在得到的:

Designation HUC YEAR    RO_MM   HIST    HUC Historic Mean   D
mricgcm 1010004 1961    71.8                
mricgcm 1010004 1962    119             
mricgcm 1010004 1963    177.7               
mricgcm 1010004 1964    166             
mricgcm 1010004 1965    159             
mricgcm 1010004 1966    180.3

所以,有些事情正在发生,但没有数据。

标签: rsorting

解决方案


这是我的解决方案。目录结构为

.
├── copy_means_to_FUCs.R
├── HUCs
│  ├── mricgcm_1010001.csv
│  └── mricgcm_1010002.csv
└── means.csv

然后代码组织为

library(data.table)
# install.packages("qpcR") 

means <- fread("means.csv")
means$HUC <- as.character(means$HUC)

# get all file's name
fn <- list.files("./HUCs",pattern="*.csv",full.names = TRUE)

f_paste <- function(x){
  csv <- fread(x)
  num <- gsub(".*_(.*).csv","\\1",x)
  tmp <- cbind(csv,means[num == HUC,]) # match row by name then cbind them
  #tmp <- qpcR:::cbind.na(csv, means[num == HUC,])
  fwrite(tmp,x)
  invisible(return(NULL)) 
}

invisible(lapply(fn, f_paste)) # Attention: run once is enough

不完美的地方是means由于cbind. 我认为这不是要解决的核心问题。cbind(你可以用replceqpcR:::cbind.na(csv, means[num == HUC,])解决这个问题)


推荐阅读