【问题标题】:R Loop - Adding rows without predefined dimensionsR Loop - 添加没有预定义尺寸的行
【发布时间】:2016-05-04 13:48:33
【问题描述】:

我想将测试结果存储在矩阵或 data.frame 内的 R for 循环内,其中包含(在本例中)两列,行数不确定,因为行数取决于if 语句。

我正在比较一周中几天的计数,然后进行成对比较。这是现在的代码:

week <- c(Mon = 401, Tue = 199, Wed = 187, Thur = 202, Fri = 240, Sat = 212, Sun = 244)
names(week) <- NULL
observed <- week


for(i in 1:(length(observed) - 1)){
  for(j in 1:(length(observed))){
    test <- chisq.test(c(observed[i], observed[j]), p = rep(1/2, 2))
    if(test$p.value < 0.002380952) print(c(i,j)) 
  }
}

现在的输出是:

[1] 1 2
[1] 1 3
[1] 1 4
[1] 1 5
[1] 1 6
[1] 1 7
[1] 2 1
[1] 3 1
[1] 4 1
[1] 5 1
[1] 6 1

但是根据函数中if 语句的结果,它可能会更长。此外,我想最终消除排列。

寻找在循环中启动空矩阵(或data.frame)的方法,他们似乎提前合并了维度,例如days &lt;- matrix(NA, nrow = length(observed)^2, ncol = 2)

我希望有一个不确定的行数。

【问题讨论】:

    标签: r loops matrix


    【解决方案1】:

    这行得通:

    mat <- combn(1:length(observed),2)
    vec <- apply(mat, 2, function(x) chisq.test(observed[x],p=rep(1/2,2))$p.value)
    mat[,c(vec < 0.002380952)] 
    
    #     [,1] [,2] [,3] [,4] [,5] [,6]
    #[1,]    1    1    1    1    1    1
    #[2,]    2    3    4    5    6    7
    

    说明: combn 查找数字之间的所有组合并将它们作为矩阵返回(2 行乘 n 列)。然后我们遍历 n 列并找到 p 值。然后,我们将mat 子集化为vec 中小于您的阈值的元素。

    【讨论】:

    • OP 想要排列,而不是组合
    • 现在我很困惑。 Further I want to ultimately erase permutations. 我将此解释为 OP 想要摆脱排列并保留组合。
    • 我认为这意味着 OP 不想提前计算排列以及它有多超前,我不知道。
    • 好的,所以你想要的是创建一个空矩阵,然后每次满足你的 if 循环时,你都将这对附加到底部,对吧?由于 R 的工作方式,这是非常低效的。阅读 The R Inferno (burns-stat.com/pages/Tutor/R_inferno.pdf) 的第 2 章以了解原因。通常最好简单地创建一个矩阵(或数据框),在其中预先指定行数和列数,并为所有单元格指定值NA。运行所有测试后,您可以简单地删除带有NA 的所有行。
    • (1) 正确。 x 仅包含一列 mat,其中包含 2 个值,您可以使用它们从 observed 获取正确的值。 (2) 你的意思是,创建空向量并附加到它们是不是很糟糕?一般来说,如果向量变得很长,你应该避免它。如果您只希望向量中有
    【解决方案2】:

    所以我创建了可能组合的排列进行测试,使用apply 提取每个组合并将其发送到chisq.test 并提取与您的阈值匹配的组合。

    week <- c(Mon = 401, Tue = 199, Wed = 187, Thur = 202, Fri = 240, Sat = 212, Sun = 244)
    mat.comparison <- as.matrix(t(expand.grid(1:length(week), 1:length(week))))
    mat.out <- t(mat.comparison[,(apply(mat.comparison, 2,
                                        function(n) {
                                            chisq.test(week[n], p = rep(1/2, 2))[["p.value"]] < 0.002380952}
                                        ))])
    

    【讨论】:

    • 不太清楚删除排列是什么意思。如果您的意思是想要组合而不是排列,则可以轻松切换到代码。
    • 感谢您的回答。我认为括号或方括号可能存在​​小问题,但expand.gridapply 行明智的想法是有道理的。不过,我确实在寻找更通用的东西,不需要任何类型的先验维度参考(在本例中为 (length(week))。
    • 已修复。我不确定你为什么有这种需要,因为在某些时候你会得到一个向量来测试它们的值,对吗?到那时,就可以取长度了。
    • 我试图解释为什么我想要不确定行数的灵活性,但我是编码的初学者。仅供参考,我在运行您的帖子时仍然遇到错误。我 +1,但你可能想调查一下。
    • 哎呀这几乎令人尴尬。是的另一个复制和粘贴错误。对不起。现已修复。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多