【问题标题】:R: different errors from using apply()R:使用 apply() 的不同错误
【发布时间】:2017-03-20 01:21:48
【问题描述】:

过去 2 天我一直在尝试调试它,应用了我在 Stack Overflow 上找到的所有可能的修复程序,但我仍然遇到各种错误,我不知道我还能做什么。

dat 是一个 3051 行 38 列的数据框,取自 multtest 库中的 golub 数据集。 数据样本:

> dat[1:5, 1:5]
     V1       V2       V3       V4       V5
g1 -1.45769 -1.39420 -1.42779 -1.40715 -1.42668
g2 -0.75161 -1.26278 -0.09052 -0.99596 -1.24245
g3  0.45695 -0.09654  0.90325 -0.07194  0.03232
g4  3.13533  0.21415  2.08754  2.23467  0.93811
g5  2.76569 -1.27045  1.60433  1.53182  1.63728

我已经定义了这个函数:

> wilcox.func <- function(x, s1, s2) {
+ x1 <- x[s1]
+ x2 <- x[s2]
+ x1 <- as.numeric(x1)
+ x2 <- as.numeric(x2)
+ w.out <- wilcox.test(x1, x2, exact=F, alternative="two.sided", correct=T)
+ out <- as.numeric(w.out$statistic)
+ return(out) }

我尝试将其应用于:

> apply(dat, 1, wilcox.func, s1=c(1:27), s2=c(28:38))

我想运行 wilcox.test() 函数,前 27 列为 x,其余列为 y(基于 golub.cl)。但是,我收到此错误:

Error in wilcox.test(x1, x2, exact = F, alternative = "two.sided", correct = T) : 
  unused arguments (exact = F, alternative = "two.sided", correct = T)

删除 exact = F, alternative = "two.lateral", correct = T 给我一个新错误 x[s1] 中的错误:只有 0 可能与负下标混合。

有趣的是,在某些时候我也得到了错误 x[s1, ] 中的错误:维度数不正确 运行同一行代码(使用“未使用的参数”not 从 wilcox.test 中删除),但那是 2 天前的事,我无法再次重现它。

我也尝试过 lapply() 和 mapply(),但我得到相同的未使用参数错误。

我要实现的目标:wilcox.test(),如果我理解正确,应该应用于 x 向量由第 1 到 28 列和 y 向量列 29 到 38 组成的每一行.

如果这是我遗漏的一个愚蠢的简单问题,我深表歉意。我只是不知道它是什么:(

编辑:这在重新启动 R 后现在可以工作(以及 Parfait 的代码)......对不起,这可能是我在发布之前首先尝试过的......

【问题讨论】:

  • dput()您的数据。将指针悬停在 r 标签上以了解更多信息。
  • @Hack-R 对不起,这是我第一次发布关于 R 的帖子。我如何dput 我的数据?你的意思是我的帖子里应该有library(multtest)dput(data(golub))
  • 我不确定我明白你想要做什么。您是指对每个列组合进行单独测试,即 28x9 = 252 次测试?
  • @Joe 我认为应该是 3051 wilcox.test()(对于 3051 行),其中 x (x1) 由 cols 1-27 和 y (x2) 是 cols 28-38 .
  • 好的,我想我明白了。这个问题:stackoverflow.com/q/30332752/4477364问类似的问题,你见过吗?

标签: r apply lapply


【解决方案1】:

考虑 sapply()vapply()(预定义输出类型)在行号之间进行迭代,因为您需要按列范围对每一行进行切片。下面使用示例数据但调整为完整的.dat

# READ IN SAMPLE dat
data ='
V0       V1       V2       V3       V4       V5
g1 -1.45769 -1.39420 -1.42779 -1.40715 -1.42668
g2 -0.75161 -1.26278 -0.09052 -0.99596 -1.24245
g3  0.45695 -0.09654  0.90325 -0.07194  0.03232
g4  3.13533  0.21415  2.08754  2.23467  0.93811
g5  2.76569 -1.27045  1.60433  1.53182  1.63728'

dat <- read.table(text=data, header=TRUE, stringsAsFactors=FALSE)

# ADJUSTED FUNCTION
wilcox.func <- function(s1, s2) {
 x1 <- as.numeric(s1)
 x2 <- as.numeric(s2)

 w.out <- wilcox.test(x1, x2, exact=F, alternative="two.sided", correct=T)
 out <- as.numeric(w.out$statistic)
 return(out) 
}

output <- sapply(seq_len(nrow(dat)), function(i)
    wilcox.func(dat[i, c(2:4)], dat[i, c(5:6)]))    
output
# [1] 2 4 4 3 3

output <- vapply(seq_len(nrow(dat)), function(i)
    wilcox.func(dat[i, c(2:4)], dat[i, c(5:6)]), 
    numeric(1))    
output
# [1] 2 4 4 3 3

【讨论】:

  • 谢谢@Parfait,但遗憾的是我仍然收到 wilcox.test() 相同的未使用参数错误:(
  • 这怎么可能?这将使用您的示例数据和 wilcox.test 中的确切参数。请检查您是如何合并到实际代码中的。您是否运行了此解决方案(包括示例数据)并收到错误?
  • 我使用了完整的数据集dat &lt;- read.table(text=data(golub), header=TRUE, stringsAsFactors=FALSE),而不是样本子集......这会有所不同吗?我将尝试重新启动我的 R 会话并重新运行代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多