我有包含多个数字和字符列(超过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.convert
和select
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")
您可以使用grepl
在sapply
不测试,如果有两个.
。
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