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)
我一直在尝试解决这个问题,但无论我尝试什么都没有成功,网上和这个网站上找到的解决方案也没有用。
我有超过 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行
为了克服这个问题,我尝试了不同的方法,包括;
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)