多个(不均匀的行号)csv文件到R中的矩阵
multiple (uneven row numbers) csv files into a matrix in R
总的来说,我想在 R 中使用 gplots 制作热图。所以我需要将 csv 文件组合成一个矩阵。我尝试了各种尝试,但我一直 运行 解决行长度不均匀的问题。
例如当我从我得到的代码中尝试这种方法时
num.el <- sapply(a, length)
res <- cbind(unlist(a), rep(1:length(a), num.el))
我收到错误
Error in structure(res, levels = lv, names = nm, class = "factor") :
'names' attribute [24] must be the same length as the vector [2]
我有 40 多个行号不均匀的 csv 文件。我在下面包含了两个示例
test1.csv
ark,
Actinocyclus actinochilus,7
Asterionella formosa,4
Aulacodiscus orientalis,1
Aulacoseira granulata,3
Chaetoceros radicans,1
Corethron hystrix,6
Coscinodiscaceae,1
Dactyliosolen fragilissimus,32
Diadesmis gallica,1
Diatoma hyemalis,1
Synedropsis hyperboreoides,4
Trigonium formosum,4
Urosolenia eriensis,2
test2.csv
ant,
Actinocyclus actinochilus,55
Asterionella formosa,3
Aulacoseira granulata,5
Chaetoceros radicans,7
Dactyliosolen fragilissimus,5
Diatoma hyemalis,5
Stephanopyxis turris,1
Striatella unipunctata,1
Synedropsis hyperboreoides,28
Trigonium formosum,3
Urosolenia eriensis,2
如您所见,名称有重叠,但文件并不完全匹配。为要构建的热图克服缺失数据的最佳方法是什么?
问题是您在第一列中只有一个 "row",因此 R 不知道如何处理您的数据名称。
这里我们创建文件夹中所有 .csv 文件的列表:
z <- list.files(pattern = ".*csv")
然后使用readLines
读入每个文件,然后只使用2:end
的数据作为read.table
,并将第一行作为列的名称:
data <- lapply(z, function(x) {temp <- readLines(x);
read.table(text = temp[2:length(temp)], sep = ",", col.names = c("Species", temp[1]))})
现在您的数据应该是一个数据框列表。
我假设你想要 merge
他们:
Reduce(function(x, y) merge(x, y, all=TRUE), data)
从您的示例数据中得到以下信息:
Species ark. ant.
1 Actinocyclus actinochilus 7 55
2 Asterionella formosa 4 3
3 Aulacodiscus orientalis 1 NA
4 Aulacoseira granulata 3 5
5 Chaetoceros radicans 1 7
6 Corethron hystrix 6 NA
7 Coscinodiscaceae 1 NA
8 Dactyliosolen fragilissimus 32 5
9 Diadesmis gallica 1 NA
10 Diatoma hyemalis 1 5
11 Synedropsis hyperboreoides 4 28
12 Trigonium formosum 4 3
13 Urosolenia eriensis 2 2
14 Stephanopyxis turris NA 1
15 Striatella unipunctata NA 1
总的来说,我想在 R 中使用 gplots 制作热图。所以我需要将 csv 文件组合成一个矩阵。我尝试了各种尝试,但我一直 运行 解决行长度不均匀的问题。
例如当我从我得到的代码中尝试这种方法时
num.el <- sapply(a, length)
res <- cbind(unlist(a), rep(1:length(a), num.el))
我收到错误
Error in structure(res, levels = lv, names = nm, class = "factor") :
'names' attribute [24] must be the same length as the vector [2]
我有 40 多个行号不均匀的 csv 文件。我在下面包含了两个示例
test1.csv
ark,
Actinocyclus actinochilus,7
Asterionella formosa,4
Aulacodiscus orientalis,1
Aulacoseira granulata,3
Chaetoceros radicans,1
Corethron hystrix,6
Coscinodiscaceae,1
Dactyliosolen fragilissimus,32
Diadesmis gallica,1
Diatoma hyemalis,1
Synedropsis hyperboreoides,4
Trigonium formosum,4
Urosolenia eriensis,2
test2.csv
ant,
Actinocyclus actinochilus,55
Asterionella formosa,3
Aulacoseira granulata,5
Chaetoceros radicans,7
Dactyliosolen fragilissimus,5
Diatoma hyemalis,5
Stephanopyxis turris,1
Striatella unipunctata,1
Synedropsis hyperboreoides,28
Trigonium formosum,3
Urosolenia eriensis,2
如您所见,名称有重叠,但文件并不完全匹配。为要构建的热图克服缺失数据的最佳方法是什么?
问题是您在第一列中只有一个 "row",因此 R 不知道如何处理您的数据名称。
这里我们创建文件夹中所有 .csv 文件的列表:
z <- list.files(pattern = ".*csv")
然后使用readLines
读入每个文件,然后只使用2:end
的数据作为read.table
,并将第一行作为列的名称:
data <- lapply(z, function(x) {temp <- readLines(x);
read.table(text = temp[2:length(temp)], sep = ",", col.names = c("Species", temp[1]))})
现在您的数据应该是一个数据框列表。
我假设你想要 merge
他们:
Reduce(function(x, y) merge(x, y, all=TRUE), data)
从您的示例数据中得到以下信息:
Species ark. ant.
1 Actinocyclus actinochilus 7 55
2 Asterionella formosa 4 3
3 Aulacodiscus orientalis 1 NA
4 Aulacoseira granulata 3 5
5 Chaetoceros radicans 1 7
6 Corethron hystrix 6 NA
7 Coscinodiscaceae 1 NA
8 Dactyliosolen fragilissimus 32 5
9 Diadesmis gallica 1 NA
10 Diatoma hyemalis 1 5
11 Synedropsis hyperboreoides 4 28
12 Trigonium formosum 4 3
13 Urosolenia eriensis 2 2
14 Stephanopyxis turris NA 1
15 Striatella unipunctata NA 1