我有一个
.csv
格式的计数矩阵。数据结构如下:
基因 | 条件。 1 | 条件。 2 | 条件。 3 |
---|---|---|---|
阿尔法 | 77 | 51 | 98 |
测试版 | 0 | 0 | 71 |
塞纳 | 823 | 856 | 0 |
我正在尝试过滤掉新矩阵中总和大于 0 的行的矩阵。
为了过滤掉总和为0的行,我这样编写了代码:
Counts <- Count[which(rowSums(Counts) > 0, ]
但它给了我一个错误:
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'which': 'x' must be numeric
我检查了数据,看看是否有 NA,但没有。只有数字。
这是我的完整代码:
library(DESeq2)
library(ggplot2)
Counts <- read.delim("RiboTag_count_matrix_10-05-2023.csv", header = TRUE, sep=",")
Counts # shows the matrix visually
Counts <- Counts[which(rowSums(Counts > 0,] # filterout rows with 0's
我不确定我的代码中哪里产生了错误。任何意见是极大的赞赏。谢谢你。
我什至尝试过
# Convert Counts to a matrix
Counts <- as.matrix(Counts)
# Convert them to numeric
Counts <- apply(Counts, 2, as.numeric)
# Check for and handle missing values
if (any(is.na(Counts))) {
# Handle missing values (e.g., replace with 0)
Counts[is.na(Counts)] <- 0
}
解决我的问题,但仍然给我相同的错误消息
等等,你尝试喝不加奶的咖啡,但先买加奶的,稍后再拿出来。
在文档中
?read.delim
,我们在“CSV 文件”部分进一步阅读,
最常见的带有行名称的 CSV 文件形式需要使用
使用文件第一列中的名称作为行名称,read.csv(..., row.names = 1)
也适用于
read.delim
。就在上面我们了解到,我们得到的Value是一个data.frame
。
因此,要获得具有所需整数以及行和列名称的
matrix
,请执行
(Counts <- read.delim('foo.csv', row.names=1) |> as.matrix())
# cond.1 cond.2 cond.3
# Alpha 77 51 98
# Beta 0 0 71
# Gamma 823 856 0
# Delta 0 0 0
# Epsilon 59 NA 1
class(Counts)
# [1] "matrix" "array"
typeof(Counts)
# [1] "integer"
一切都很好。
与
which
相关的事情是,它“关心”NA
。 (我在 Epsilon 行添加了一个来演示。)
使用
which
时也会删除带有 NA
的行,
Counts[which(rowSums(Counts) > 0), ]
# cond.1 cond.2 cond.3
# Alpha 77 51 98
# Beta 0 0 71
# Gamma 823 856 0
不使用它,就会失败。
Counts[rowSums(Counts) > 0, ]
# cond.1 cond.2 cond.3
# Alpha 77 51 98
# Beta 0 0 71
# Gamma 823 856 0
# <NA> NA NA NA
但是,您可能需要决定是否真的要删除这些行,还是对它们执行其他操作,例如首先估算或检查
NA
来自哪里。
数据:
.csv 文件:
"cond.1" "cond.2" "cond.3"
"Alpha" 77 51 98
"Beta" 0 0 71
"Gamma" 823 856 0
"Delta" 0 0 0
"Epsilon" 59 NA 1