r - 检查是否每一列都是 na
r - check if every column is na
我在数据框中有一个列列表,我想在其中检查所有这些列是否为 NA
并创建一个新列来告诉我它们是否为 NA
。
这是一个使用一列的示例,其中 Any_Flag
是我的新列:
ItemStats_2014$Any_Flag <- ifelse(is.na(ItemStats_2014$Item_Flag_A), "Y", "N")
当我尝试 运行 检查多列时,我得到了我期望的结果:
ItemStats_2014$Any_Flag <- ifelse(all(is.na(ItemStats_2014[ ,grep("Flag", names(ItemStats_2014), value = T)])), "Y", "N")
它returns一切都是假的或"N"。
我不确定 grep
部分应该做什么,但这里有一个更简单的方法来完成你想要的:
apply(ItemStats_2014[, 2:10], MARGIN = 1, FUN = function(x) all(is.na(x)))
将 2:10
替换为您要检查的任何列。
修改: 如果您想检测哪些列包含单词 "Flag" 而不是硬编码它们的索引——无论如何这会更好! -- 我喜欢用于处理文本的包 stringr
。您可以对 select 您的专栏执行此操作:
library(stringr)
MyCols <- which(str_detect(names(ItemStats_2014), "Flag"))
现在,将上面 apply(...
代码中的 2:10
替换为 MyCols
。
我认为您正在尝试测试一行(而不是一列)是否至少包含一个 NA。
这里是一个数据集
x = c(1:10, NA)
df = data.frame(A = sample(x), B = sample(x), C = sample(x))
这里是一个用 anyNA
测试的循环
df$Any_na = apply(df[,2:3], 1, anyNA)
df
A B C Any_na
1 NA 8 9 FALSE
2 5 9 NA TRUE
3 9 3 10 FALSE
4 7 5 1 FALSE
5 4 2 3 FALSE
6 10 4 6 FALSE
7 3 1 2 FALSE
8 6 6 5 FALSE
9 1 10 7 FALSE
10 2 NA 8 TRUE
11 8 7 4 FALSE
这可能会帮助您入门:
# Sample dataframe
dfx <- data.frame(
x = c(21L, 21L, 21L, 22L, 22L, NA),
y = c(1449, 1814, 582, 582, 947, 183),
s = c(26.4, 28.7, 32, 25.3, NA, 25.7),
z = c(NA,NA,NA,NA,NA,NA)
)
# Sapply works well here
ifelse(sapply(dfx, function(x)all(is.na(x))) == TRUE, "Y","N")
输出:
x y s z
"N" "N" "N" "Y"
数据
set.seed(1)
data <- c(LETTERS, NA)
df <- data.frame(Flag_A = sample(data), Flag_B = sample(data),
C = sample(data), D = sample(data), Flag_E = sample(data))
df <- rbind(NA, df)
代码
识别每行的所有 NA:
> df$All_NA <- apply(df[, grep("Flag", names(df))], 1, function(x) all(is.na(x)))
> head(df)
Flag_A Flag_B C D Flag_E All_NA
1 <NA> <NA> <NA> <NA> <NA> TRUE
2 H K B T Y FALSE
3 J W C K P FALSE
4 O I H I <NA> FALSE
5 V L M S R FALSE
6 E N P E I FALSE
每行至少识别一个 NA:
> df$Any_NA <- apply(df[, grep("Flag", names(df))], 1, function(x) anyNA(x))
> head(df)
Flag_A Flag_B C D Flag_E Any_NA
1 <NA> <NA> <NA> <NA> <NA> TRUE
2 H K B T Y FALSE
3 J W C K P FALSE
4 O I H I <NA> TRUE
5 V L M S R FALSE
6 E N P E I FALSE
没有任何 apply
的 data.table
方法是:
library(arsenal)
library(data.table)
# dummy data
set.seed(1)
data = c(LETTERS, NA)
dt = data.table(Flag_A=sample(data), Flag_B = sample(data), C=sample(data), D=sample(data), Flag_E=sample(data))
dt = rbind(NA, dt)
# All-NA/Any-NA check
columns_to_check = names(dt)[grep('Flag', names(dt))]
dt[, AllNA:=allNA(.SD), by=1:nrow(dt), .SDcols = columns_to_check]
dt[, AnyNA:=anyNA(.SD), by=1:nrow(dt), .SDcols = columns_to_check]
我在数据框中有一个列列表,我想在其中检查所有这些列是否为 NA
并创建一个新列来告诉我它们是否为 NA
。
这是一个使用一列的示例,其中 Any_Flag
是我的新列:
ItemStats_2014$Any_Flag <- ifelse(is.na(ItemStats_2014$Item_Flag_A), "Y", "N")
当我尝试 运行 检查多列时,我得到了我期望的结果:
ItemStats_2014$Any_Flag <- ifelse(all(is.na(ItemStats_2014[ ,grep("Flag", names(ItemStats_2014), value = T)])), "Y", "N")
它returns一切都是假的或"N"。
我不确定 grep
部分应该做什么,但这里有一个更简单的方法来完成你想要的:
apply(ItemStats_2014[, 2:10], MARGIN = 1, FUN = function(x) all(is.na(x)))
将 2:10
替换为您要检查的任何列。
修改: 如果您想检测哪些列包含单词 "Flag" 而不是硬编码它们的索引——无论如何这会更好! -- 我喜欢用于处理文本的包 stringr
。您可以对 select 您的专栏执行此操作:
library(stringr)
MyCols <- which(str_detect(names(ItemStats_2014), "Flag"))
现在,将上面 apply(...
代码中的 2:10
替换为 MyCols
。
我认为您正在尝试测试一行(而不是一列)是否至少包含一个 NA。
这里是一个数据集
x = c(1:10, NA)
df = data.frame(A = sample(x), B = sample(x), C = sample(x))
这里是一个用 anyNA
df$Any_na = apply(df[,2:3], 1, anyNA)
df
A B C Any_na
1 NA 8 9 FALSE
2 5 9 NA TRUE
3 9 3 10 FALSE
4 7 5 1 FALSE
5 4 2 3 FALSE
6 10 4 6 FALSE
7 3 1 2 FALSE
8 6 6 5 FALSE
9 1 10 7 FALSE
10 2 NA 8 TRUE
11 8 7 4 FALSE
这可能会帮助您入门:
# Sample dataframe
dfx <- data.frame(
x = c(21L, 21L, 21L, 22L, 22L, NA),
y = c(1449, 1814, 582, 582, 947, 183),
s = c(26.4, 28.7, 32, 25.3, NA, 25.7),
z = c(NA,NA,NA,NA,NA,NA)
)
# Sapply works well here
ifelse(sapply(dfx, function(x)all(is.na(x))) == TRUE, "Y","N")
输出:
x y s z
"N" "N" "N" "Y"
数据
set.seed(1)
data <- c(LETTERS, NA)
df <- data.frame(Flag_A = sample(data), Flag_B = sample(data),
C = sample(data), D = sample(data), Flag_E = sample(data))
df <- rbind(NA, df)
代码
识别每行的所有 NA:
> df$All_NA <- apply(df[, grep("Flag", names(df))], 1, function(x) all(is.na(x)))
> head(df)
Flag_A Flag_B C D Flag_E All_NA
1 <NA> <NA> <NA> <NA> <NA> TRUE
2 H K B T Y FALSE
3 J W C K P FALSE
4 O I H I <NA> FALSE
5 V L M S R FALSE
6 E N P E I FALSE
每行至少识别一个 NA:
> df$Any_NA <- apply(df[, grep("Flag", names(df))], 1, function(x) anyNA(x))
> head(df)
Flag_A Flag_B C D Flag_E Any_NA
1 <NA> <NA> <NA> <NA> <NA> TRUE
2 H K B T Y FALSE
3 J W C K P FALSE
4 O I H I <NA> TRUE
5 V L M S R FALSE
6 E N P E I FALSE
没有任何 apply
的 data.table
方法是:
library(arsenal)
library(data.table)
# dummy data
set.seed(1)
data = c(LETTERS, NA)
dt = data.table(Flag_A=sample(data), Flag_B = sample(data), C=sample(data), D=sample(data), Flag_E=sample(data))
dt = rbind(NA, dt)
# All-NA/Any-NA check
columns_to_check = names(dt)[grep('Flag', names(dt))]
dt[, AllNA:=allNA(.SD), by=1:nrow(dt), .SDcols = columns_to_check]
dt[, AnyNA:=anyNA(.SD), by=1:nrow(dt), .SDcols = columns_to_check]