r - 计算两个列表中对应元素是否大于 0
问题描述
我有两个列表,bi.1 和 bi.2,我想计算每个列表中的相应元素是否大于 0。如果两者都大于零,即 bi.1[[i]] 和 bi.2 [[I]],则计数应为 2,如果其中只有一个大于 0,则计数应为 1,如果它们都不大于 0,则计数应为 0。我正在存储在列表 bi.timehom 中计数。我认为带有 if_else 语句的 for 循环会起作用。
数据:
dput(pij.unc.96_05)
structure(c(0.388888888888889, 0.0897435897435897, 0.0295698924731183,
0.00645161290322581, 0, 0, 0, 0.375, 0.471153846153846, 0.228494623655914,
0.119354838709677, 0.0307692307692308, 0.0520833333333333, 0,
0.180555555555556, 0.224358974358974, 0.432795698924731, 0.309677419354839,
0.148717948717949, 0.09375, 0, 0.0416666666666667, 0.150641025641026,
0.223118279569892, 0.303225806451613, 0.307692307692308, 0.208333333333333,
0.0789473684210526, 0.0138888888888889, 0.0544871794871795, 0.0672043010752688,
0.183870967741935, 0.292307692307692, 0.25, 0.342105263157895,
0, 0.00961538461538462, 0.010752688172043, 0.0612903225806452,
0.179487179487179, 0.302083333333333, 0.236842105263158, 0, 0,
0.00806451612903226, 0.0161290322580645, 0.041025641025641, 0.09375,
0.342105263157895), .Dim = c(7L, 7L), .Dimnames = list(i = c("Aaa",
"Aa", "A", "Baa", "Ba", "B", "Caa"), j = c("Aaa", "Aa", "A",
"Baa", "Ba", "B", "Caa")))
dput(pij.unc.05_13)
structure(c(0.268292682926829, 0.0600706713780919, 0.0159744408945687,
0.0255474452554745, 0, 0, 0, 0.390243902439024, 0.526501766784452,
0.23961661341853, 0.12043795620438, 0.130208333333333, 0.0862068965517241,
0.0476190476190476, 0.268292682926829, 0.240282685512367, 0.389776357827476,
0.259124087591241, 0.151041666666667, 0.155172413793103, 0.0952380952380952,
0.0731707317073171, 0.0918727915194346, 0.23961661341853, 0.317518248175182,
0.260416666666667, 0.137931034482759, 0.142857142857143, 0, 0.0565371024734982,
0.0894568690095847, 0.193430656934307, 0.270833333333333, 0.25,
0.0476190476190476, 0, 0.0247349823321555, 0.0255591054313099,
0.0766423357664234, 0.15625, 0.267241379310345, 0.571428571428571,
0, 0, 0, 0.0072992700729927, 0.03125, 0.103448275862069, 0.0952380952380952
), .Dim = c(7L, 7L), .Dimnames = list(i = c("Aaa", "Aa", "A",
"Baa", "Ba", "B", "Caa"), j = c("Aaa", "Aa", "A", "Baa", "Ba",
"B", "Caa")))
dput(bi.1)
list(5L, 6L, 7L, 7L, 6L, 6L, 4L)
dput(bi.2)
list(4L, 6L, 6L, 7L, 6L, 6L, 6L)
代码:
#Bi --> #nhi > 0
bi.timehom <- list()
#sub-sample 1
bi.1 <- list()
#sub-sample 2
bi.2 <- list()
for (i in seq_along(1:7)) {
bi.1[[i]] <- nnzero(pij.unc.96_05[i,], na.counted = FALSE)
}
for (i in seq_along(1:7)) {
bi.2[[i]] <- nnzero(pij.unc.05_13[i,], na.counted = FALSE)
}
# check if both samples are greater than 0
for (i in seq_along(1:7)) {
if_else(bi.1[[i]] > 0 & bi.2[[i]] > 0, bi.timehom[[i]] <- 2,
if_else(bi.1[[i]] > 0 | bi.2[[i]] > 0, bi.timehom[[i]] <- 1, bi.timehom[[i]] <- 0))
}
预期输出:
bi.timehom
>
[[1]]
[1] 2
[[2]]
[1] 2
[[3]]
[1] 2
[[4]]
[1] 2
[[5]]
[1] 2
[[6]]
[1] 2
[[7]]
[1] 2
解决方案
我相信dplyr
'if_else
函数的文档中存在导致您的问题的问题。我用传统的 if...then...else 对其进行了重新设计,并且条目的乘积只有在符号相反时才会为负(以缩短代码):
for (i in seq_along(1:7)) {
if (bi.1[[i]] > 0 & bi.2[[i]] > 0){
bi.timehom[[i]] <- 2
} else if (bi1[[i]]*bi.2[[i]] < 0){
bi.timehom[[i]] <- 1
} else {
bi.timehom[[i]] <- 0
}
}
原始代码也适用ifelse
于 Base R 中的函数。
for (i in seq_along(1:7)) {
ifelse(bi.1[[i]] > 0 & bi.2[[i]] > 0, bi.timehom[[i]] <- 2,
ifelse(bi.1[[i]] > 0 | bi.2[[i]] > 0, bi.timehom[[i]] <- 1, bi.timehom[[i]] <- 0))
}
推荐阅读
- clojure - 您如何在 clojure ring 服务器中提供动态创建的文件?
- javascript - myFunction 未在 Javascript 中定义
- python - 我有一个字节数组的字符串表示,但我需要原始字节表示
- python - 根据数组索引绘制 y 坐标的二维数组
- python - 如何使用 Telethon 将图像下载到我的本地 PC
- kotlin - 使用 Room 自动生成主键不起作用
- c - C程序显示罗马数字直到n
- python - 使用python查找列表给定部分中最大数字的索引
- javascript - 如何设置 VueJS 路由和 NodeJS Express API 路由?
- node.js - 使用JS在mongo中复合搜索条件