使用“rowSums”过滤计数矩阵的行会给出错误“x”必须是数字

问题描述 投票:0回答:1

我有一个

.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,但没有。只有数字。

这是我的完整代码:

Counts <- read.delim("RiboTag_count_matrix_10-05-2023.csv", header = TRUE, sep=",")

Counts  ## shows the matrix visually

Counts <- Counts[which(rowSums(Counts > 0,]  ## filter out 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
}

解决我的问题,但仍然给我相同的错误消息。

r sorting matrix filtering
1个回答
0
投票

等等,你尝试喝不加奶的咖啡,但先买加奶的,稍后再拿出来。

在文档中

?read.delim
,我们在“CSV 文件”部分进一步阅读,

最常见的带有行名称的 CSV 文件形式需要使用

read.csv(..., row.names = 1)
使用文件第一列中的名称作为行名称,

也适用于

read.delim
。在上面的部分中,我们了解到,我们得到的 Value 是一个
data.frame
,并且需要执行
as.matrix()
才能获得矩阵。

因此,要获得具有所需整数以及行和列名称的

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
来自哪里。

附录

matrix
es 与
data.frame
不同,只能包含一个
typeof
数据,例如数字(整数、双精度)或字符。如果我们有一个数字矩阵
m
,

(m <- matrix(0, 2, 2))
#      [,1] [,2]
# [1,]    0    0
# [2,]    0    0

typeof(m)
# [1] "double"

并且仅将一个元素更改为字符,

m[1, 2] <- 'A'
m
#      [,1] [,2]
# [1,] "0"  "A" 
# [2,] "0"  "0" 

我们得到一个字符矩阵,

typeof(m)
# [1] "character"

您的

Count
矩阵就是这种情况。


数据:

foo.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
© www.soinside.com 2019 - 2024. All rights reserved.