首页 > 解决方案 > 计算两个列表中对应元素是否大于 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

标签: rlistcount

解决方案


我相信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)) 
}

推荐阅读