【问题标题】:Function returns NA in for loop函数在 for 循环中返回 NA
【发布时间】:2019-02-08 03:43:00
【问题描述】:

您好,我有一个数据框,我想表示一些行。我正在使用

imc <- dfWoNA[1,]
imc <-head(imc,-1)

id20 <- unique_entrezgene_ids[1:20]

for (j in id20) {
  rows <- dfWoNA [which(dfWoNA$X == as.double(j)),]
  temp <- colMeans(rows[,2:285], na.rm = FALSE)
  nx <- c(j,temp)
  imc <- rbind(imc,nx)

  rm(rows)
  rm(nx)
  rm(temp)
}

显示状态但是上面函数的结果我只为第一行获取结果如果没有手动循环我正在为 id20 中的每个元素获取结果但 for 循环为除第一行之外的行提供 NA 结果.如果你能帮助我,我很感激。谢谢你。

【问题讨论】:

  • 在 R 中,90% 的时间你想要循环,你不应该循环。研究“矢量化”。正如 akrun 在他的回答中显示的那样,这可以很容易地用两三行来完成。另一种选择是rowMeans

标签: r for-loop dataframe


【解决方案1】:

我们可以使用tidyverse 来做到这一点。按'X'分组,得到mean所有列的summarise_allbind原始数据集的行

library(tidyverse)
dfWoNA %>%
   group_by(X) %>% 
   summarise_all(mean, na.rm = TRUE) %>% 
   bind_rows(dfWoNA, .)

【讨论】:

  • 这是一个很好的答案,谢谢你,但我还有一个问题要问你如何在 R 中学习这样的东西?有什么书可以推荐吗?我自己发现,当我在搜索时卡住时很难做到,它们被称为管道 %>% 运算符我怎样才能成为这样的专家?
  • @alkanschtein 谢谢。您可以查看here 提到的资源。此外,与任何编程语言一样,实践是关键。所以,继续练习一个月,它会变得比你开始时更容易。
  • 有没有我可以给你看我的整个代码来审查?
猜你喜欢
  • 2021-01-06
  • 2021-05-23
  • 2015-08-08
  • 2020-08-21
  • 1970-01-01
  • 2019-09-29
  • 2019-06-02
  • 2015-08-08
  • 2013-01-18
相关资源
最近更新 更多