R 根据每行中缺少的值选择列
我想知道(对于每一行),我的数据中的任何NA都属于哪些列。我们的目标是创建一个新的列/变量,列出数据为该行显示NA的列的名称,最好使用dplyr 使用此模拟数据R 根据每行中缺少的值选择列,r,dplyr,R,Dplyr,我想知道(对于每一行),我的数据中的任何NA都属于哪些列。我们的目标是创建一个新的列/变量,列出数据为该行显示NA的列的名称,最好使用dplyr 使用此模拟数据 data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5)) 我想创建缺少的列: var_1 var_2 var_3 missing_col 1 NA 4 NA "va
data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5))
我想创建缺少的列:
var_1 var_2 var_3 missing_col
1 NA 4 NA "var_1", "var_3"
2 4 5 NA "var_3"
3 5 6 NA "var_3"
4 6 7 3 NA
5 7 8 5 NA
到目前为止,我的方法是将rowwise()函数与mutate、嵌套的select_if()和函数结合使用。然而,迄今为止我没有尝试过的任何功能都允许我单独考虑每一行(而不是整个列)。下面我介绍了我的方法的总体结构
data %>%
rowwise() %>%
mutate(missing_col = select_if(function(x) ... )) %>%
names()
如能提供有关适当功能的任何指导,我们将不胜感激。您可以尝试以下方法:
#Unlist the results from apply
missing_col=unlist(x=apply(X=data, MARGIN=1, FUN=function(x){
#Get the names of the rows which have NA
NamesNA=names(which(is.na(x)))
#If there's no NA then replace the 'character(0)' for NA.
if(length(NamesNA)!=0){
#Concatenate names if there are more than one
paste0(NamesNA, collapse=",")
}else{
#Replace 'character(0)'
NA
}
})
)
#Add column with desired output
data$missing_col=missing_col
这将提供所需的输出:
# A tibble: 5 x 4
var_1 var_2 var_3 missing_col
<dbl> <dbl> <dbl> <chr>
1 NA 4 NA var_1,var_3
2 4 5 NA var_3
3 5 6 NA var_3
4 6 7 3 NA
5 7 8 5 NA
#一个tible:5 x 4
变量1变量2变量3缺少列
1 NA 4 NA变量1,变量3
2 4 5纳瓦鲁3
3 5 6纳瓦鲁3
4673NA
5785NA
>数据%>%
+mutate(缺少_col=apply(,1,函数(x),即.na(x)))%>%
+map_chr(,函数(x)if_else(长度(x)=0,
+“不适用”,
+粘贴(名称(x),折叠=“,”))
#一个tibble:5x4
变量1变量2变量3缺少列
1 NA 4 NA变量1,变量3
2 4 5纳瓦鲁3
3 5 6纳瓦鲁3
4673NA
5785NA
这不是一种整洁的方式,但应用程序似乎足够简单:
data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5))
data$missing = apply(data,1,function(x) names(x)[is.na(x)])
哪些产出:
data
# A tibble: 5 x 4
var_1 var_2 var_3 missing
<dbl> <dbl> <dbl> <list>
1 NA 4.00 NA <chr [2]>
2 4.00 5.00 NA <chr [1]>
3 5.00 6.00 NA <chr [1]>
4 6.00 7.00 3.00 <chr [0]>
5 7.00 8.00 5.00 <chr [0]>
一种可能的解决方案是在mutate中直接使用
apply
,而不是rowwise
。也许可以采用与行方式等效的方法,但我对该函数的经验有限。第二个mutate
仅当您需要NA
用于没有NA
的行时才需要
data %>%
mutate(missing_col = apply(., 1, function(x) names(.)[is.na(x)] %>% paste(collapse = ", "))) %>%
mutate(missing_col = if_else(missing_col == "", NA_character_, missing_col))
如果我运行它,我最终得到一个TIBLE,它在新列中不显示实际的列名--只显示“”,而打印出来时它不显示数据,您将能够访问缺少的列中的每个值,而这里的一些其他答案将它们组合成一个字符串,这将很难处理。这非常有帮助,因为我需要物品的数量。谢谢你,利奥!
data$missing[[1]]
[1] "var_1" "var_3"
data$missing[[1]][1]
[1] "var_1"
data %>%
mutate(missing_col = apply(., 1, function(x) names(.)[is.na(x)] %>% paste(collapse = ", "))) %>%
mutate(missing_col = if_else(missing_col == "", NA_character_, missing_col))