假设某个元素与 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 <- read.csv('csv2.csv')
并使用它。以上是关于假设某个元素与 R 中的 CSV 文件的文件名相同,则将数据框中的某个元素相乘的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何将csv文件某一列中所有相同元素的行分别另外以要求的命名格式保存