选择R中为数字的字符列



我有包含多个数字和字符列(超过1000列)的数据集,我想识别只能转换为数字变量的字符变量。例子:

> Df
ID var0 var1 var2  var3
1  1   10   1A    a 500.2
2  2    8    2    b   400
3  3    9    7    c 603.1
4  4    2 aa4e    d   700
> str(Df)
'data.frame':   4 obs. of  5 variables:
$ ID  : chr  "1" "2" "3" "4"
$ var0: num  10 8 9 2
$ var1: chr  "1A" "2" "7" "aa4e"
$ var2: chr  "a" "b" "c" "d"
$ var3: chr  "500.2" "400" "603.1" "700"

这里需要的列是:ID和var3

提前感谢!

我们可以用type.convertselect

library(dplyr)
Df %>%
type.convert(as.is = TRUE) %>% 
select(where(is.numeric))

与产出

#   ID var0  var3
#1  1   10 500.2
#2  2    8 400.0
#3  3    9 603.1
#4  4    2 700.0

或者选择包含任何数字部分的列

library(stringr)
Df %>%
select(where(~ any(str_detect(., '^[0-9]+$'))))

数据
Df <- structure(list(ID = c("1", "2", "3", "4"), var0 = c(10L, 8L, 
9L, 2L), var1 = c("1A", "2", "7", "aa4e"), var2 = c("a", "b", 
"c", "d"), var3 = c("500.2", "400", "603.1", "700")), row.names = c("1", 
"2", "3", "4"), class = "data.frame")

您可以使用greplsapply不测试,如果有两个.

sapply(Df, function(x) !any(grepl("[^0-9.]", x)))
#   ID  var0  var1  var2  var3 
# TRUE  TRUE FALSE FALSE  TRUE 

或:

sapply(Df, function(x) all(!is.na(as.numeric(x))))
#   ID  var0  var1  var2  var3 
# TRUE  TRUE FALSE FALSE  TRUE 

您可以尝试以下正则表达式解决方案:

names(Filter(function(x) is.character(x) && all(grepl('^\d+\.\d+$', x)), Df))

这是另一个基本R选项,使用Filter+is.numeric+type.convert

> Filter(is.numeric, type.convert(Df, as.is = TRUE))
ID var0  var3
1  1   10 500.2
2  2    8 400.0
3  3    9 603.1
4  4    2 700.0

相关内容

  • 没有找到相关文章

最新更新