R 中列表中的 rbind(文本到列)

rbind in a list in r (text to column)

提问人:Seyma Kalay 提问时间:5/4/2023 更新时间:5/5/2023 访问量:27

问:

我在一个目录中有 3 个文件。数据集具有标题和格式。.csvtext; text; text;

`list_data <- list("Red; Green", 
                  "Green; Blue",
                  "Blue; Yellow")
print(list_data)`

我想根据相同的标头将它们合并为 1 个 .csv。

  files  <- list.files(pattern = '\\.csv')
tables <- lapply(files, read.csv, header = TRUE)
combined.df <- do.call(rbind , tables)
str(combined.df)

如何解决这个问题?提前非常感谢。

r dplyr tidyr 数据操作 整洁

评论

1赞 r2evans 5/4/2023
如果您不确定列是否具有相同的结构,则盲目地在现有文件上分配标头可能会很危险。如果标题不同,您如何确定列仍然相同?要求:这里的示例数据()不是CSV格式的一个很好的表示,你能提供2-3个CSV文件中的几行进行演示吗?list_data
0赞 Seyma Kalay 5/5/2023
仔细观察,我发现第三个数据集有额外的列。尝试根据公共列对列表进行子集化。
1赞 r2evans 5/5/2023
如果我没看错你的代码,你正在使用 which uses ;您的值看起来是分隔的 (?),并且要么是无标头,要么是仅标头。但是,如果这些代表您想要的标题,那么我建议使用 or ,两者都将按照我认为您的意图按名称对齐。read.csvsep=","list_data;read.csv2dplyr::bind_rows(tables)data.table::rbindlist(tables, fill=TRUE, use.names=TRUE)

答:

1赞 r2evans 5/5/2023 #1

对实际数据进行一些假设,我将稍微更改示例数据:

list_data <- list(file1="Red; Green\n1;2", file2="Green; Blue\n3;4", file3="Blue; Yellow\n5;6")

我添加了名称以启用在数据行中保留文件名的选项(远在下面)。

# tables <- lapply(setNames(nm = files), read.csv2) # what you call with a file list
tables <- lapply(list_data, function(z) read.csv2(text = z))
str(tables)
# List of 3
#  $ file1:'data.frame':    1 obs. of  2 variables:
#   ..$ Red  : int 1
#   ..$ Green: int 2
#  $ file2:'data.frame':    1 obs. of  2 variables:
#   ..$ Green: int 3
#   ..$ Blue : int 4
#  $ file3:'data.frame':    1 obs. of  2 variables:
#   ..$ Blue  : int 5
#   ..$ Yellow: int 6
dplyr::bind_rows(tables)
#   Red Green Blue Yellow
# 1   1     2   NA     NA
# 2  NA     3    4     NA
# 3  NA    NA    5      6
data.table::rbindlist(tables, fill = TRUE, use.name = TRUE)
#      Red Green  Blue Yellow
#    <int> <int> <int>  <int>
# 1:     1     2    NA     NA
# 2:    NA     3     4     NA
# 3:    NA    NA     5      6

如果要保留每一行的文件名,则

dplyr::bind_rows(tables, .id = "filename")
#   filename Red Green Blue Yellow
# 1    file1   1     2   NA     NA
# 2    file2  NA     3    4     NA
# 3    file3  NA    NA    5      6
data.table::rbindlist(tables, fill = TRUE, use.name = TRUE, idcol = "filename")
#    filename   Red Green  Blue Yellow
#      <char> <int> <int> <int>  <int>
# 1:    file1     1     2    NA     NA
# 2:    file2    NA     3     4     NA
# 3:    file3    NA    NA     5      6