如何 select 具有等于或超过 2 个唯一值的列,同时忽略 NA 和空白?
How to select columns with equal or more than 2 unique values while ignoring NA and blank?
我的数据框看起来与此类似:
df <- data.frame(ID = c(1, 2, 3, 4, 5),
color = c(NA, "black", "black", NA, "brown"),
animal = c("dog", "", "", "", "")
owner = c("YES", "NO", "NO", "YES", NA))
ID
color
animal
owner
1
NA
dog
YES
2
black
NO
3
black
NO
4
NA
YES
5
brown
NA
我想检索具有超过 2 个唯一值的所有列的列名,同时在此计算中忽略 NA 和 blanks/empty 字符串。
目前我的解决方案:
df_col <- df %>%
select_if(function(col) length(unique(na.omit(col)))>1)
df_col <- colnames(df_col)
但我注意到 na.omit() 无济于事,因为它会删除整行。
如有任何帮助,我们将不胜感激。提前致谢!
使用 n_distinct
,它也有 na.rm
参数,_if/_at/_all
被弃用,取而代之的是 across/where
。可以使用 nzchar
检查空字符串 (''
),其中 returns 只有在 non-empty 时才为 TRUE,因此使用 nzchar
对列的元素进行子集化然后按列应用 n_distinct
并仅对 select
这些列创建条件,然后获取 names
library(dplyr)
df %>%
select(where(~ n_distinct(.x[nzchar(.x)], na.rm = TRUE) > 1)) %>%
names
-输出
[1] "ID" "color" "owner"
一个选项也是将""
转换为NA
(na_if
),也许会稍微紧凑一些
df %>%
select(where(~ n_distinct(na_if(.x, ""), na.rm = TRUE) > 1)) %>%
names
您可以用 NA (na_if
) 替换带有“”的值,然后使用 lengths
来计算唯一值的数量。使用 names
和 which
获取具有两个以上值的名称向量。
names(which(lengths(lapply(na_if(df, ""), \(x) unique(x[!is.na(x)]))) >= 2))
[1] "ID" "color" "owner"
结合n_distinct
:
colnames(df)[lapply(na_if(df, ""), n_distinct, na.rm = T) >= 2]
[1] "ID" "color" "owner"
我的数据框看起来与此类似:
df <- data.frame(ID = c(1, 2, 3, 4, 5),
color = c(NA, "black", "black", NA, "brown"),
animal = c("dog", "", "", "", "")
owner = c("YES", "NO", "NO", "YES", NA))
ID | color | animal | owner |
---|---|---|---|
1 | NA | dog | YES |
2 | black | NO | |
3 | black | NO | |
4 | NA | YES | |
5 | brown | NA |
我想检索具有超过 2 个唯一值的所有列的列名,同时在此计算中忽略 NA 和 blanks/empty 字符串。
目前我的解决方案:
df_col <- df %>%
select_if(function(col) length(unique(na.omit(col)))>1)
df_col <- colnames(df_col)
但我注意到 na.omit() 无济于事,因为它会删除整行。
如有任何帮助,我们将不胜感激。提前致谢!
使用 n_distinct
,它也有 na.rm
参数,_if/_at/_all
被弃用,取而代之的是 across/where
。可以使用 nzchar
检查空字符串 (''
),其中 returns 只有在 non-empty 时才为 TRUE,因此使用 nzchar
对列的元素进行子集化然后按列应用 n_distinct
并仅对 select
这些列创建条件,然后获取 names
library(dplyr)
df %>%
select(where(~ n_distinct(.x[nzchar(.x)], na.rm = TRUE) > 1)) %>%
names
-输出
[1] "ID" "color" "owner"
一个选项也是将""
转换为NA
(na_if
),也许会稍微紧凑一些
df %>%
select(where(~ n_distinct(na_if(.x, ""), na.rm = TRUE) > 1)) %>%
names
您可以用 NA (na_if
) 替换带有“”的值,然后使用 lengths
来计算唯一值的数量。使用 names
和 which
获取具有两个以上值的名称向量。
names(which(lengths(lapply(na_if(df, ""), \(x) unique(x[!is.na(x)]))) >= 2))
[1] "ID" "color" "owner"
结合n_distinct
:
colnames(df)[lapply(na_if(df, ""), n_distinct, na.rm = T) >= 2]
[1] "ID" "color" "owner"