我想检查,在R中的数据帧中,多个变量的值应该在0和1之间,不应该有NA
这是我正在处理的大型数据集(3000列)的一个小示例。 我必须弄清楚如何检查这些列中没有NA,值应该是0和1我想检查,在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
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
这可以在baseR
中通过以下方式完成:
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)))