results <- apply(data, 1, function(x) { + test <- wilcox.test(x ~ Type) + pvalue <- test$p.value + Sig <- ifelse(pvalue < 0.001, "***", ifelse(pvalue < 0.01, "**", ifelse(pvalue < 0.05, "*", ""))) + if(pvalue < 0.05) { + paste0(row.names(data)[which(x)], Sig) + } else { + "" + } + }) Error in which(x) : argument to 'which' is not logical Called from: which(x) Browse[1]>
时间: 2024-02-01 11:03:23 浏览: 32
这个错误的原因是which()函数需要一个逻辑向量作为输入,但在这里,我们传递给which()函数的是数值向量x。
为了解决这个问题,我们需要使用另一个函数来获取当前行的行号。在apply函数中,我们可以使用第三个参数MARGIN来指定应用函数的方向。当MARGIN为1时,apply函数将对每一行应用函数,此时我们可以使用seq_along()函数来获取当前行的行号。修改后的代码如下:
```
results <- apply(data, 1, function(x) {
test <- wilcox.test(x ~ Type)
pvalue <- test$p.value
Sig <- ifelse(pvalue < 0.001, "***", ifelse(pvalue < 0.01, "**", ifelse(pvalue < 0.05, "*", "")))
if(pvalue < 0.05) {
paste0(row.names(data)[seq_along(x)], Sig)
} else {
""
}
})
sigVec <- results[results != ""]
sigGeneVec <- row.names(data)[which(results != "")]
```
这样,我们可以使用seq_along()函数获取当前行的行号,并将其与行名连接起来。
相关问题
for(i in row.names(data)){ + test=wilcox.test(data[i,] ~ Type) + pvalue=test$p.value + Sig=ifelse(pvalue<0.001,"***",ifelse(pvalue<0.01,"**",ifelse(pvalue<0.05,"*",""))) + if(pvalue<0.05){ + sigVec=c(sigVec, paste0(i, Sig)) + sigGeneVec=c(sigGeneVec, i)} + } Error in model.frame.default(formula = data[i, ] ~ Type) : 参数'data[i, ]'的种类(list)不对
这个错误的原因是在wilcox.test函数的公式中,参数data应该是一个数据框或矩阵,而不是一个单一的向量。在这里,data[i,]返回的是一个长度为1的列表,而不是一个数据框或矩阵。为了解决这个问题,你可以将data转换为数据框或矩阵,并使用适当的列和行来进行子集选择。例如,你可以使用以下代码:
```
for(i in row.names(data)){
test=wilcox.test(as.matrix(data[,i]) ~ Type)
pvalue=test$p.value
Sig=ifelse(pvalue<0.001,"***",ifelse(pvalue<0.01,"**",ifelse(pvalue<0.05,"*","")))
if(pvalue<0.05){
sigVec=c(sigVec, paste0(i, Sig))
sigGeneVec=c(sigGeneVec, i)}
}
```
在这个例子中,as.matrix()函数将data转换为矩阵,并使用[,i]来选择第i行。
帮我优化一下:for(i in row.names(data)){ test=wilcox.test(as.matrix(data[,i])~ Type) pvalue=test$p.value Sig=ifelse(pvalue<0.001,"***",ifelse(pvalue<0.01,"**",ifelse(pvalue<0.05,"*",""))) if(pvalue<0.05){ sigVec=c(sigVec, paste0(i, Sig)) sigGeneVec=c(sigGeneVec, i)} }
可以采用以下方式优化这段代码:
1. 预分配sigVec和sigGeneVec的长度,避免在循环中无限增长向量长度。
```
sigVec <- vector("character", length = nrow(data))
sigGeneVec <- vector("character", length = nrow(data))
```
2. 使用apply函数替代for循环,极大地提高代码效率。
```
results <- apply(data, 1, function(x) {
test <- wilcox.test(x ~ Type)
pvalue <- test$p.value
Sig <- ifelse(pvalue < 0.001, "***", ifelse(pvalue < 0.01, "**", ifelse(pvalue < 0.05, "*", "")))
if(pvalue < 0.05) {
paste0(row.names(data)[which(x)], Sig)
} else {
""
}
})
sigVec <- results[results != ""]
sigGeneVec <- row.names(data)[which(results != "")]
```
这样,我们可以将整个数据集作为一个矩阵传递给apply函数,apply函数会自动对每一行应用指定的函数。我们使用匿名函数来执行Wilcoxon秩和检验,并返回结果。最终,我们可以从结果中提取sigVec和sigGeneVec。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)