【问题标题】:R: for loop executed only for the last list elementR:for循环仅对最后一个列表元素执行
【发布时间】:2021-09-02 07:12:14
【问题描述】:

我有一个来自不同门类和类别的样本数据集(mags),我想对其进行排序。 首先,我创建了一个空列表,其中包含与我拥有的不同门一样多的空数据框。 原则上这是可行的,但已经可以在输出中看到问题。

Phylum <- c("a", "b", "c", "d")
Mags <- data.frame(Phylum=c("a", "a", "b", "c", "d", "d", "d"), 
                   Class=c("A1", "A2", "B1", "C1", "D1", "D2", "D3"))

erg <- list()

for (i in length(Phylum)) {
  erg[[i]] <- data.frame(i)
}

names(erg) <- Phylum

之后,我想对样本进行排序。哪个门包含哪些类。 类应该写入数据框,而每个门在列表中都有自己的数据框。

for (i in length(Phylum)){
  erg[[i]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[i]]))
  
}

在输出中,它仅适用于列表的最后一个元素。但我不知道为什么。

为了确保该函数原则上符合我的要求,我在没有 for 循环的情况下进行了尝试。

erg[[1]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[1]]))
erg[[2]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[2]]))
erg[[3]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[3]]))
erg[[4]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[4]]))

提前感谢您的帮助。

【问题讨论】:

  • 你能复制粘贴当前输出的样子以及你在循环之后想要什么吗?

标签: r list for-loop


【解决方案1】:

您应该将length(Phylum) 替换为seq_along(Phylum)

for (i in seq_along(Phylum)){ # or 1:length(Phylum)
  erg[[i]] <- data.frame(unique(Mags$Class[Mags$Phylum == Phylum[i]]))
}

length(Phylum) 等于 4,但您需要 1 到 4。

【讨论】:

  • 1:length(Phylum)
  • 非常感谢!我很高兴这是一个小错误:D
  • 没关系...有时这些小错误需要数小时才能调试。此外,您可以使用 Rstudio 调试器。
  • @arashHaratian 我认为 "tidier"seq_along 的错误形容词。人们喜欢使用seq_along() 的主要原因是,如果输入的长度恰好为 0,您将不会因为循环超过1, 0 而导致错误,因此“更健壮”“更稳定” 是很好的形容词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多