R 理解行为映射与sapply:查看包含特定值的列名
根据变量(-99,-100,NA),我的数据集代码“不可用”。它有100个变量,因此第一步是查找受影响的列,以便对它们进行适当的重新编码 编辑:多亏了@joran和@G.Grothendieck,我很快得到了答案。只是为了提供一个TL;DR:colSums的R 理解行为映射与sapply:查看包含特定值的列名,r,dplyr,apply,purrr,R,Dplyr,Apply,Purrr,根据变量(-99,-100,NA),我的数据集代码“不可用”。它有100个变量,因此第一步是查找受影响的列,以便对它们进行适当的重新编码 编辑:多亏了@joran和@G.Grothendieck,我很快得到了答案。只是为了提供一个TL;DR:colSums的colSums选项可能是最好的:快速、简洁、灵活(尽管它的参数不容易放入变量?) 我可以想象这与sapply的工作方式有关,但文档和答案对我来说并不十分合适 我提出了以下方法,可以很好地单独或分组检查值。我欢迎任何改进(例如,将值保留在找到它
colSums
选项可能是最好的:快速、简洁、灵活(尽管它的参数不容易放入变量?)
我可以想象这与sapply
的工作方式有关,但文档和答案对我来说并不十分合适
我提出了以下方法,可以很好地单独或分组检查值。我欢迎任何改进(例如,将值保留在找到它们的列旁边)
colnames(tbl_-df[unlist(map(tbl_-df,~any(.%in%c(-99,-100,NA))))
#>[1]“a”“b”“c”
另一方面,我真的不明白为什么尝试在管道中实现类似的事情会产生错误的结果
tbl_df%>%
筛选所有(所有变量(.=-99))%>%
colnames()
#>[1]“a”“b”“c”“d”“e”
抱歉,如果这看起来像是一堆混杂的问题;但我希望你能澄清 1)drop=FALSE订阅data.frame将删除1d结果的维度,除非使用了drop=FALSE
,请尝试此操作。(TIBLE下标不会删除维度。)
或更简单:
names(df)[apply(is.na(df), 2, any)]
## [1] "a"
或
2)na.rm=TRUE在下一个示例中,第一列中有一个na。如果我们排除这一点,我们会得到一个答案:
# colnames(tbl_df[,sapply(tbl_df, function(x) any(x == -100))])
colnames(tbl_df[, sapply(tbl_df, function(x) any(x == -100, na.rm = TRUE))])
## [1] "c"
或
或者使用哪个
names(tbl_df[, sapply(tbl_df, function(x) length(which(x == -100)) > 0)])
## [1] "c"
或
或者使用哪个(…,arr.ind=TRUE)
3)简化我们可以通过将不依赖于数据的通用部分分解为is.bad来简化此过程:
# colnames(tbl_df[unlist(map(tbl_df, ~any(. %in% c(-99, -100, NA))))])
is.bad <- function(x) any(x %in% c(-99, -100, NA))
names(tbl_df)[ sapply(tbl_df, is.bad) ]
## [1] "a" "b" "c"
或者对于不同的方法:
names(tbl_df)[colSums(is.na(tbl_df) | tbl_df == -99 | tbl_df == -100) > 0]
## [1] "a" "b" "c"
4)使用all\u vars
逐行选择\u iffilter\u all
,并选择所有列都满足条件的行。你想一列一列地走,而不是一行一行地走。如果出现以下情况,请使用选择\u:
tbl_df %>%
select_if(~ any(. == -99)) %>%
names
## [1] "a" "b"
1)drop=FALSE订阅data.frame将删除1d结果的维度,除非使用了drop=FALSE
,请尝试此操作。(TIBLE下标不会删除维度。)
或更简单:
names(df)[apply(is.na(df), 2, any)]
## [1] "a"
或
2)na.rm=TRUE在下一个示例中,第一列中有一个na。如果我们排除这一点,我们会得到一个答案:
# colnames(tbl_df[,sapply(tbl_df, function(x) any(x == -100))])
colnames(tbl_df[, sapply(tbl_df, function(x) any(x == -100, na.rm = TRUE))])
## [1] "c"
或
或者使用哪个
names(tbl_df[, sapply(tbl_df, function(x) length(which(x == -100)) > 0)])
## [1] "c"
或
或者使用哪个(…,arr.ind=TRUE)
3)简化我们可以通过将不依赖于数据的通用部分分解为is.bad来简化此过程:
# colnames(tbl_df[unlist(map(tbl_df, ~any(. %in% c(-99, -100, NA))))])
is.bad <- function(x) any(x %in% c(-99, -100, NA))
names(tbl_df)[ sapply(tbl_df, is.bad) ]
## [1] "a" "b" "c"
或者对于不同的方法:
names(tbl_df)[colSums(is.na(tbl_df) | tbl_df == -99 | tbl_df == -100) > 0]
## [1] "a" "b" "c"
4)使用all\u vars
逐行选择\u iffilter\u all
,并选择所有列都满足条件的行。你想一列一列地走,而不是一行一行地走。如果出现以下情况,请使用选择\u:
tbl_df %>%
select_if(~ any(. == -99)) %>%
names
## [1] "a" "b"
在第一个示例中,您遇到了数据帧列子集设置的drop=FALSE
问题。如果只有一列,结果将“删除”到单个向量,因此没有列名……在其他情况下,您似乎忘记了在any()
中使用na.rm=FALSE
。最后,filter
函数对数据框的行进行子集,而不是列,因此我希望任何使用filter
的操作都会导致您开始使用的所有列。在第一个示例中,您遇到了数据框列子集的drop=FALSE
问题。如果只有一列,结果将“删除”到单个向量,因此没有列名……在其他情况下,您似乎忘记了在any()
中使用na.rm=FALSE
。最后,filter
函数是数据帧行的子集,而不是列的子集,因此我希望任何使用filter
的操作都会产生您开始使用的所有列。
tbl_df %>%
select_if(~ any(. == -99)) %>%
names
## [1] "a" "b"