r - 基于多个标准添加因子的 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”。我应该如何修改代码以使其正确
解决方案
请注意,这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"
))
推荐阅读
- c# - Mac上的“dotnet publish”创建一个.dll,但在Linux上产生一个可执行文件?
- python - 如何将相关子查询转换为 pyspark 代码
- c# - HttpContext.Current.Server.MapPath() 返回不一致的结果
- postgresql - Apache Airflow 将 Postgress 安装为后端数据库 - 错误
- html - 如何减少同一 mat-option 中文本行之间的间距?
- c++ - C++ 析构函数:无法访问类中声明的私有成员
- css - 悬停结束时的抵消效果
- java - 如何使用 RxJava 持续更新 UI
- azure-cosmosdb - 使用 .NET SDK 在 Cosmos DB 中批量删除支持
- ruby-on-rails - Herkou Redis - 证书验证失败(证书链中的自签名证书)