假设某个元素与 R 中的 CSV 文件的文件名相同,则将数据框中的某个元素相乘

Posted

技术标签:

【中文标题】假设某个元素与 R 中的 CSV 文件的文件名相同,则将数据框中的某个元素相乘【英文标题】:Multiplying a certain element in a dataframe, given that certain element is the same as the filename of a CSV file in R 【发布时间】:2020-03-24 04:02:35 【问题描述】:

我正在尝试解决大数据问题,这涉及到 2 个不同的 CSV 文件。 如果 CSV1 的文件名与 CSV2 中的某个元素匹配,我会将 CSV1 的每个元素与 CSV2 的某个元素相乘。顺便说一句,我正在使用 R。

让我们将这些作为数据样本:

CSV1 文件名是:318

01/01/2005 00:00        0.1
01/01/2005 01:00        0.4
01/01/2005 02:00        0.5

CSV2:

hey 318 0.08
sol 497 0.22
mat 498 0.06

因此为 0.1。 CSV1 的 0.4 和 0.5 必须乘以 0.08

【问题讨论】:

您是否对许多 csv* 文件执行此操作?为什么不将文件名(318)作为列添加到 csv1,使用第二列作为 id 将 csv2 合并到 csv1(仅保留 csv2 的最后一列),并将两列合并在一起 不幸的是,是的。我必须对一千个文件执行此操作,每个文件有数千行。 【参考方案1】:

您可以使用list.files 获取要应用此功能的所有文件名,遍历每个文件名,读取它,match 使用csv2 数据帧并获得相应的值以相乘。

filenames <- list.files('path/of/files', full.names = TRUE, pattern = "\\.csv$")

list_df <- lapply(filenames, function(x) transform(read.csv(x, header = FALSE), 
             V3 = V3 * csv2$V3[match(
                  tools::file_path_sans_ext(basename(x)), csv2$V2)]))

这将返回您可以访问的更新数据帧列表,例如list_df[[1]]list_df[[2]] 等。

csv2 在哪里

csv2 <- structure(list(V1 = structure(c(1L, 3L, 2L), .Label = c("hey", 
"mat", "sol"), class = "factor"), V2 = c(318L, 497L, 498L), V3 = c(0.08, 
0.22, 0.06)), class = "data.frame", row.names = c(NA, -3L))

【讨论】:

嗨,先生,V3 = V3 * csv2$V3[match(tools::file_path_sans_ext(basename(x)), csv2$V2)])),它是否对应于例如0.1。 CSV1 的 0.4 和 0.5 乘以 0.08? 是的,所以我假设 csv1$V3 是 0.1。 0.4 和 0.5,csv2$V2 是 318、497 和 498,csv2$V3 是 0.08、0.22 和 0.06。如果列名被称​​为其他名称,请相应调整。 我仍在试图弄清楚,因为我看不到这两个元素在我的工作中成倍增加。我想提取 csv2 中的两个数据帧,但我收到错误消息说两个 dfs 有不同的行数。 先生,如果 CSV2 的结构不是一个列表怎么办(就像上面显示的那样)。我实际上希望它在 R 中作为另一个数据帧读取(通过让 R 通过 read.csv 命令读取 csv2 文件)。 @karate csv2 以上共享仅用于演示目的。如果您在 csv 中有数据,请执行 csv2 &lt;- read.csv('csv2.csv') 并使用它。

以上是关于假设某个元素与 R 中的 CSV 文件的文件名相同,则将数据框中的某个元素相乘的主要内容,如果未能解决你的问题,请参考以下文章

将文件夹中的多个csv文件读入R中的单个数据框[重复]

python 如何将数据写入某个csv文件的特定位置?

Python:如何将csv文件某一列中所有相同元素的行分别另外以要求的命名格式保存

Python:如何将csv文件某一列中所有相同元素的行分别另外以要求的命名格式保存

合并多个 CSV 文件并删除 R 中的重复项

如何使用ruby [duplicate]从CSV文件中获取第二行