R计数器不计算整数(0)

R counter doesn't count integer(0)

我一直在尝试解决这个问题,但无论我尝试什么都没有成功,网上和这个网站上找到的解决方案也没有用。

我有超过 50 万行的此类数据集。

示例子集:

subset= as.data.frame(matrix(c(9,9,9,0,2,9,0,9,9,1,0,2,9,9,9,0,0,0,2,2,2,1,1,1),ncol = 3, byrow = T))

每一列都是一个个体,每一行都是一个特定的标记,“0,1,2”表示该行没有缺失数据(当然还有其他含义,但这里没有必要解释)和“ 9" 表示该行缺少数据。 我打算把数字写成带引号的,以使其清晰可见,但它在数据集中是数字。

我想做的是计算至少有一个样本没有丢失的行。 因此,在全部由“9”组成的行中,计数器不会增加。如果该特定行中至少有一个单元格不是 9,则计数器将增加 1。

经过一段时间的尝试,我写下了这段代码:

counter=0

test = apply(subset, 1,  function(i) {
  if(length(which(subset[i,] !=9)) != 0){
    counter=counter+1
  }
  print(counter)
  assign("counter",counter,envir = .GlobalEnv)
})

当我这样做时,当唯一 cell/or 不是“9”的单元格是整数 (0) 时,计数器不会增加。比如我上传的图片,第9行由很多个“9”和一个整数(0)组成。这一行的计数器不会增加,但我也必须计算它。

为了克服这个问题,我尝试了不同的方法,包括;

1- 将 identical(length(which(dummy[i,] ==0)), integer(0))all() 函数放置在循环的不同位置,并尝试了各种 if else 语句。我也尝试了各种我不记得所有的方法,试图计算 integer(0).

2- 将 9 更改为 NA/将整数 (0) 更改为另一个数字,例如 3。这些都改变了循环机制,现在无论行中的单元格如何,计数器都会增加 1 .

3- 使用 if 条件和 ( condition < 9*ncol(subset) ),我认为会给出结果(如果其中任何一个不是 missing/9,它将小于 9*ncol) , 但 R 再次将其视为整数 (0) 并且没有任何变化。

4- 试图找到结果为“零”的位置是行不通的,因为 我在开头编写的代码 对缺失数据“9”给出了相同的结果s 也是(零)。我只想从柜台取出丢失的结果。

如果有人能就此问题提供帮助,我们将不胜感激。由于 Whosebug 想保持评论区的感谢信息干净,我想提前向大家说声谢谢。

据我所知,您想计算至少有一个值不同于 9 的行数。有很多方法可以做到这一点,下面是两种选择。

使用 dplyr

您可以像这样使用 dplyr 执行此操作:

library(dplyr)

# Your provided data
subset %>% 
  filter(if_any(everything(), ~ .x != 9)) %>% 
  nrow()
#> [1] 6

reprex package (v2.0.1)

于 2022-05-29 创建

filter(if_any(everything(), ~ .x != 9))中,filter()删除至少有一个值不等于9的行。之后,我们只计算行数。

apply()

如果您想使用应用,您可以执行以下操作:

sum(
  apply(
    subset, 
    MARGIN = 1, 
    function(x) {
      any(x != 9)
    }
  )
)
#> [1] 6

reprex package (v2.0.1)

于 2022-05-29 创建

在这里,我用 apply() 遍历 subset 的每一行,并检查该行的任何值是否不等于 9。这个 returns [=18= 的向量]/FALSE。我们 sum() 这个向量找到至少有一个值不同于 9 的总行数。

这是我觉得最容易理解的选项。您可以创建一个附加列 counter,其值基于其他变量。 case_when 函数检查您的列的值,如果找到 9,则将 0 放入 counter 列。如果它在您的任何列中都没有找到 9,则 returns 为 1。然后您可以对 counter 列求和以检查没有 9 的总行数。

library(dplyr)
subset <- as.data.frame(matrix(c(9, 9, 9, 0, 2, 9, 0, 9, 9, 1, 0, 2, 9, 9, 9, 0, 0, 0, 2, 2, 2, 1, 1, 1), ncol = 3, byrow = T))
subset <- subset %>%
  mutate(counter = case_when(
    V1 == 9 ~ 0,
    V2 == 9 ~ 0,
    V3 == 9 ~ 0,
    TRUE ~ 1
  ))
number_of_full_rows <- sum(subset$counter)

如果您确定自己了解基本版本,可以缩短它,这样您就不必为所有列命名。

library(dplyr)
subset <- as.data.frame(matrix(c(9, 9, 9, 0, 2, 9, 0, 9, 9, 1, 0, 2, 9, 9, 9, 0, 0, 0, 2, 2, 2, 1, 1, 1), ncol = 3, byrow = T))
subset <- subset %>%
  mutate(counter = case_when(
    if_any(.fns = ~ .x == 9) ~ 0,
    TRUE ~ 1
  ))
number_of_full_rows <- sum(subset$counter)