首页 > 解决方案 > 基于多个标准添加因子的 for 和 if 循环仅以最后一个簇结束

问题描述

我有一个这样的数据框:

df1 <- data.frame(
  E11 = c(2, 4, 6, 8), 
  E14 = c(3, 5, 7, 9), 
  E18 = c(3, 3, 3, 3), 
  Adult = c(9, 7, 5, 3), 
  E14vsE11 = c(1, 1, 1, 1), 
  E18vsE14 = c(0, -2, -4, -6), 
  AdultvsE18 = c(6, 4, 2, 0)), 
  row.names = c("geneA", "geneB", "geneC", "geneD")
)

我想根据比较值向它们添加聚类因子,我的代码是:

filtera <- df1$E14vsE11 >0 & df1$E18vsE14 >0 & df1$AdultvsE18 >0
filterb <- df1$E14vsE11 <0 & df1$E18vsE14 <0 & df1$AdultvsE18 <0
filterc <- df1$E14vsE11 ==0 & df1$E18vsE14 ==0 & df1$AdultvsE18 ==0
for (i in (1:nrow(df1))){
  if (isTRUE(filtera)){
    df1$cluster <- "cluster1"
  } else if (isTRUE(filterb)){ 
    df1$cluster <- "cluster2"
  } else if (isTRUE(filterc)){
    df1$cluster <- "cluster3"
  } else {
    df1$cluster <- "cluster4"
  }}

但是在输出中都充满了“cluster4”。我应该如何修改代码以使其正确

标签: rdataframefor-loopif-statement

解决方案


请注意,这if()不是矢量化函数。这isTrue是一种隐藏您正在传递向量的事实。当您执行类似的任务时df1$cluster <- "cluster4",R 不知道您要更新哪一行,所以它会全部完成。

一种更现代的方法是使用一点 fodplyr和一个case_when语句来进行重新分类。

library(dplyr)
df1 %>% 
  mutate(cluster = case_when(
    E14vsE11 >0 & E18vsE14 >0 & AdultvsE18 >0 ~ "cluster1",
    E14vsE11 <0 & E18vsE14 <0 & AdultvsE18 <0 ~ "cluster2",
    E14vsE11 ==0 & E18vsE14 ==0 & AdultvsE18 ==0 ~ "cluster3",
    TRUE ~ "cluster4"
  ))

推荐阅读