R中多个csv文件的完全连接
full join of multiple csv files in R
我知道类似的问题已经被问过多次,但不知何故我被困在离解决方案很近的地方。做一些研究并没有让我更接近。作为 R 的初学者,我可能会问错 questions/searching 错误的关键字。既然如此,欢迎您的帮助。
我有一个包含多个带“;”的 .csv 文件的文件夹作为分隔符。这些文件有两列构成 id。所有表格都有不同的大小,例如行数和列数不同。
例如,数据如下所示:
name
extension
data1
data2
data n
paul
ch
7
9
n1
sue
nc
0
8
n2
sue
ch
6
8
n3
etc.
数据具有以下逻辑:data1 包括来自 1 个样本(样本名称:data1)的所有数据,并包括名称出现的次数,nc 或 ch。
我现在的目标是将所有这些表整合到一个组合数据框中。
首先,我尝试使用 for 函数进行迭代,但结果很差。后来我遇到了一个 tidyverse 方法如下:
files <- dir(path = "~/Documents/data", pattern = "*.csv")
data <- files %>%
map(read_csv2(paste("~/Documents/data", files, sep = "/"))) %>%
reduce(full_join)
data
这开始工作,但失败并出现错误:
0sError: Files must all have 31 columns: 0s
* File 2 has 34 columns
这是我卡住的地方。我认为当数据帧被编译成列表时会出现问题。在我看来,数据帧必须具有相同的扩展名。在我在堆栈和其他地方找到的示例中,示例数据的长度始终相同。
谁能帮我找出错误?
祝福
map
语法为 map(list, function)
。 read_csv2(paste("~/Documents/data", files, sep = "/")
不是一个函数,它试图对所有文件进行 运行 read_csv2
,但是 read_csv2
没有被 vecrorized。更改为 purrr
样式的 lambda 语法,如下所示。我还强烈建议在您的连接中指定 by
列,尤其是完整连接,以确保您得到您认为的结果并且结果不会在大小上爆炸。
files %>%
map(~read_csv2(paste("~Documents/data", ., sep = "/")) %>%
reduce(full_join, by = c("name", "extension"))
如果你需要调试更多,给自己一个小例子,一次一行。比如说,从 files2 <- files[1:2]
开始,只读前两个文件。如果可行,请继续加入。
我知道类似的问题已经被问过多次,但不知何故我被困在离解决方案很近的地方。做一些研究并没有让我更接近。作为 R 的初学者,我可能会问错 questions/searching 错误的关键字。既然如此,欢迎您的帮助。
我有一个包含多个带“;”的 .csv 文件的文件夹作为分隔符。这些文件有两列构成 id。所有表格都有不同的大小,例如行数和列数不同。
例如,数据如下所示:
name | extension | data1 | data2 | data n |
---|---|---|---|---|
paul | ch | 7 | 9 | n1 |
sue | nc | 0 | 8 | n2 |
sue | ch | 6 | 8 | n3 |
etc. |
数据具有以下逻辑:data1 包括来自 1 个样本(样本名称:data1)的所有数据,并包括名称出现的次数,nc 或 ch。
我现在的目标是将所有这些表整合到一个组合数据框中。
首先,我尝试使用 for 函数进行迭代,但结果很差。后来我遇到了一个 tidyverse 方法如下:
files <- dir(path = "~/Documents/data", pattern = "*.csv")
data <- files %>%
map(read_csv2(paste("~/Documents/data", files, sep = "/"))) %>%
reduce(full_join)
data
这开始工作,但失败并出现错误:
0sError: Files must all have 31 columns: 0s
* File 2 has 34 columns
这是我卡住的地方。我认为当数据帧被编译成列表时会出现问题。在我看来,数据帧必须具有相同的扩展名。在我在堆栈和其他地方找到的示例中,示例数据的长度始终相同。
谁能帮我找出错误?
祝福
map
语法为 map(list, function)
。 read_csv2(paste("~/Documents/data", files, sep = "/")
不是一个函数,它试图对所有文件进行 运行 read_csv2
,但是 read_csv2
没有被 vecrorized。更改为 purrr
样式的 lambda 语法,如下所示。我还强烈建议在您的连接中指定 by
列,尤其是完整连接,以确保您得到您认为的结果并且结果不会在大小上爆炸。
files %>%
map(~read_csv2(paste("~Documents/data", ., sep = "/")) %>%
reduce(full_join, by = c("name", "extension"))
如果你需要调试更多,给自己一个小例子,一次一行。比如说,从 files2 <- files[1:2]
开始,只读前两个文件。如果可行,请继续加入。