【问题标题】:For loop and see variable name as a string in RFor循环并将变量名称视为R中的字符串
【发布时间】:2017-08-24 00:31:09
【问题描述】:

我想在 R 中创建一个 for 循环,但它应该取决于 17 个变量中的最后一个字母,而且我很难找出如何让函数将变量名视为字符串。

我现在的代码:

fisher.test(table( data.family$proband.unrelated, data.family$q_81_SQ00a)) 
fisher.test(table( data.family$proband.unrelated, data.family$q_81_SQ00b)) 
fisher.test(table( data.family$proband.unrelated, data.family$q_81_SQ00c)) 

如您所见,我只是不断重复从字母 a 到 r 的每个变量的代码,所以我想创建一个 for 循环,它可以将变量 q_81_SQ00a 的最后一个字母更改为字母 a-r。

for (i in c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r')) {

  fisher.test(data.family$proband.unrelated, data.family$q_81_SQ00'i'))  

}

我在代码中的多个位置收到警告“意外符号”。 提前致谢!

【问题讨论】:

  • 你能用数据发布一个最小的可重现示例吗?我认为在 R 中有比使用 for 循环更好的方法来做到这一点,例如dplyr 或 data.table 使用组(group_by 或 by)。

标签: r


【解决方案1】:

您必须将字母粘贴到变量名称以获取字符串,然后使用[] 运算符选择所需的变量。 另一个提示:R 中的letters 常量包含从 a 到 z 的字母。

这里有一个解决方案:

for (i in letters[1:18]) {
  fisher.test(data.family["proband.unrelated"],
              data.family[paste0("q_81_SQ00", i)])  
}

【讨论】:

  • 谢谢!我尝试运行它,但收到警告:'x' 和 'y' 必须具有相同的长度
  • @JulieRavn 与所提供的代码无关,但这完全是因为(至少)来自data.familyq_81_SQ00 元素之一与proband.unrelated 元素的长度不同。 Fisher 检验要求 xy 的长度相等。
  • 谢谢@Therkel!你是对的 - 17 个变量中有两个有选项“3”,而不仅仅是“1”和“2”。但我仍然得到一个错误(对不起,我是 R 的新手!):“'x' 必须至少有 2 行和列”。而且我已经检查过 - 现在每个变量都有两个结果。
【解决方案2】:

在 cmets 看来,您在进行某些 Fisher 测试时遇到了一些问题。要查看正确和错误,您可以在 Fisher 测试周围添加 try 函数。

lapply(letters[1:18], function(x){
    try(fisher.test(table(data.family$proband.unrelated,
                data.family[[paste0("q_81_SQ00", x)]])))
})

【讨论】:

  • 您隐式声明的原始代码有效,包括一个 table 调用,而您的循环尝试没有。我保留了这个电话,尽管这只是猜测,因为我不知道您的数据是什么样的。也许您可以在问题的底部添加str(data.family)
  • 这对我有用!我从您的代码中获得的所有 p 值与我为每个变量单独运行 fishers test 时的值相同 - 谢谢!我认为是 lapply,看不出还有什么。
  • 当使用lapply 时,我们在函数内部进行调用。然后我们可以使用try,即使某些元素导致错误,我们也可以运行代码。 You could circumvent the issue in a for loop also,但我认为使用 lapply 只是方便地将结果放在一个组合列表中。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2021-01-15
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多