我想检查,在R中的数据帧中,多个变量的值应该在0和1之间,不应该有NA

我想检查,在R中的数据帧中,多个变量的值应该在0和1之间,不应该有NA,r,R,这是我正在处理的大型数据集(3000列)的一个小示例。 我必须弄清楚如何检查这些列中没有NA,值应该是0和1 col1 <- c(1,0,0,1) col2 <- c(0,0,0,1) col3 <- c(1,0,1,0) col4 <- c(1,1,1,1) col5 <- c(1,NA,1,1) df <- data.frame(col1,col2,col3,col4,col5) co

这是我正在处理的大型数据集(3000列)的一个小示例。 我必须弄清楚如何检查这些列中没有NA,值应该是0和1

    col1 <- c(1,0,0,1) 
    col2 <- c(0,0,0,1) 
    col3 <- c(1,0,1,0) 
    col4 <- c(1,1,1,1) 
    col5 <- c(1,NA,1,1)
    
    df <- data.frame(col1,col2,col3,col4,col5)  

col1您可以使用以下基本功能:

> is.na.data.frame(df)
      col1  col2  col3  col4  col5
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE  TRUE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE
> summary(df)
      col1          col2           col3          col4        col5  
 Min.   :0.0   Min.   :0.00   Min.   :0.0   Min.   :1   Min.   :1  
 1st Qu.:0.0   1st Qu.:0.00   1st Qu.:0.0   1st Qu.:1   1st Qu.:1  
 Median :0.5   Median :0.00   Median :0.5   Median :1   Median :1  
 Mean   :0.5   Mean   :0.25   Mean   :0.5   Mean   :1   Mean   :1  
 3rd Qu.:1.0   3rd Qu.:0.25   3rd Qu.:1.0   3rd Qu.:1   3rd Qu.:1  
 Max.   :1.0   Max.   :1.00   Max.   :1.0   Max.   :1   Max.   :1  
                                                        NA's   :1

由于
na.ommit
,如果每个非
na
列都在0和1之间,则返回
TRUE

library(dplyr)
library(tidyr)

df %>% 
  summarize(across(everything(), list(btw01 = ~ all(na.omit(between(., 0, 1))),
                                      notna = ~all(!is.na(.))))) %>% 
  pivot_longer(everything(), names_sep = "_", names_to = c("Variable", ".value"))
输出

  Variable btw01 notna
  <chr>    <lgl> <lgl>
1 col1     TRUE  TRUE 
2 col2     TRUE  TRUE 
3 col3     TRUE  TRUE 
4 col4     TRUE  TRUE 
5 col5     TRUE  FALSE
  col1 col2 col3 col4  col5
1 TRUE TRUE TRUE TRUE FALSE
这可以在base
R
中通过以下方式完成:

sapply(df, function(x) all(!is.na(x) & x >= 0 & x <= 1))

我编辑了data.frame,因此我们还必须排除非零/一数值。

col1 <- c(1,0,0,1) 
col2 <- c(0,99,0,1) 
col3 <- c(1,0,1,0) 
col4 <- c(1,1,1,99) 
col5 <- c(1,NA,1,1)
df<- data.frame(col1,col2,col3,col4,col5)
更简单的解决方案 使用dplyr和purrr:

df%>%summarise_all(~.%in% c(1,0)%>%all)

  col1  col2 col3  col4  col5
1 TRUE FALSE TRUE FALSE FALSE
如果要对特定的列选择执行此操作,可以使用
cross()

或仅使用purrr

map_lgl(df, ~ all(. %in% c(1,0)))

这只是一个示例数据集。我的原始数据集有3000多个变量,这很难做到。我通常使用SPSS,并在其中使用Do Repeat循环。Do Repeat fin=col1到col5。如果(sysmis(fin)=1)err_q1=1。如果(~range(fin,0,1))err_q1=2。结束重复。freq err_q1。对于更大的数据集,您仍然可以使用
summary()
函数,它将为您提供每列NA的数量,如果您没有0和/或1,您将能够从最小/最大值、平均值和分位数值对其进行诊断。当您说“检查(每个?)列”时,您想要每列的结果吗?i、 长度为5(或3000)的布尔向量?同样,我们应该假设所有列都是整数吗?在int上检查“值应该在0和1之间”在%c(1,0)
中很简单,而在float上则需要sapply(df,function(x)all(x%in%c(1,0))——如何选择某些变量,例如从变量col2到col4。我该怎么做?我怎样才能全部替换?谢谢,我把最后一部分算出来了。非常感谢。很大的帮助。现在查看我的编辑。包括在()
df%>%summarise_all(~.%in% c(1,0)%>%all)

  col1  col2 col3  col4  col5
1 TRUE FALSE TRUE FALSE FALSE
df%>%summarise(across(1:4, ~.%in% c(1,0)%>%all))
  col1  col2 col3  col4
1 TRUE FALSE TRUE FALSE
map_lgl(df, ~ all(. %in% c(1,0)))