r - 在具有相似名称的列之间使用 for 循环
问题描述
我正在尝试使用tidyverse
( purrr
) 包for loop
在我的数据集上运行一个。我想检查数据集中某些列的某些条件是否为真。请注意,我正在尝试更加熟悉 tidyverse 及其功能,而不是依赖 Base R。
这是我要为其编写for循环的代码。
nrow(subset(data, flwr_clstr1>1 & bud_clstr1==0))
nrow(subset(data, flwr_clstr2>1 & bud_clstr2==0))
nrow(subset(data, flwr_clstr3>1 & bud_clstr3==0))
我有相似的数据列(在本例中为 flwr_clstr),但最后一位不同。此外,如果有另一种方法可以tidyverse
用来检查这些“条件”,那也很好。
这是我对 for 循环的尝试。
check1 <- vector("double", ncol(data_phen))
for (i in seq_along(data_phen)) {
check[[i]] <- nrow(subset(data, flwr_clstr[[i]]>1 & bud_clstr[[i]]==0))
}
解决方案
如果您可以提供一个可重现的示例,会更容易提供帮助,但是根据我的理解,我创建了一个您的数据可能看起来的示例。
我们可以使用map2_int
frompurrr
因为我们试图计算每对列中的行数
library(dplyr)
library(purrr)
map2_int(data %>% select(starts_with("flwr_clstr")),
data %>% select(starts_with("bud_clstr")),
~sum(.x > 1 & .y == 0)) %>% unname()
#[1] 2 3 1
但是,base R 也不是那么糟糕。这可以使用解决mapply
col1 <- grep("^flwr_clstr", names(data))
col2 <- grep("^bud_clstr", names(data))
mapply(function(x, y) sum(x > 1 & y == 0), data[col1], data[col2])
数据
假设你有相同数量的列"flwr_clstr.."
和"bud_clstr.."
data <- data.frame(flwr_clstr1 = c(2, 1, 2, 1, 0), flwr_clstr2 = c(2, 2, 2, 1, 0),
flwr_clstr3 = c(1, 1, 2, 1, 1), bud_clstr1 = 0, bud_clstr2 = 0,bud_clstr3 = 0)
看起来像
data
# flwr_clstr1 flwr_clstr2 flwr_clstr3 bud_clstr1 bud_clstr2 bud_clstr3
#1 2 2 1 0 0 0
#2 1 2 1 0 0 0
#3 2 2 2 0 0 0
#4 1 1 1 0 0 0
#5 0 0 1 0 0 0
推荐阅读
- javascript - 如何在 chrome 扩展的调试器中获取选定的元素
- c - CGAL::Surface_mesh - 使用整数索引访问面/顶点?
- python - 使用 pywinauto 发送 ALT 代码
- python - 如何将思维导图csv转换为python dict并找到密钥
- java - 使用枚举,错误:org.apache.crunch.CrunchRuntimeException:java.lang.NoSuchMethodException:
- time - 将假设参数的值添加到 Power BI 中的时间值
- ios - 加载预加载到 Core Data 中的 SQLite 数据库
- unit-testing - BDD Mockito - 使用参数捕获器时验证(...)的别名?
- css - 在Flask中使用子域时,如何访问css url中引用的静态文件和使用require.js的js文件?
- angular - Angular6 ngrx:无法读取未定义的属性“ID”