我有一个函数,它返回一个包含单个字符向量的列表,我想将其转换为数字.大多数情况下,列表中的所有元素都可以轻松地强制为数字:
所以一个简单的lapply(x, FUN = as.numeric)工作正常.
例如
l <- list(a = c("1","1"), b = c("2","2"))
l
$a
[1] "1" "1"
$b
[1] "2" "2"
lapply(l, FUN = as.numeric)
$a
[1] 1 1
$b
[1] 2 2
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况下,矢量包含真实字符:
例如
l <- list(a = c("1","1"), b = c("a","b"))
l
$a
[1] "1" "1"
$b
[1] "a" "b"
lapply(l, FUN = as.numeric)
$a
[1] 1 1
$b
[1] NA NA
Run Code Online (Sandbox Code Playgroud)
我带来的解决方案有效,但感觉有点复杂:
l.id <- unlist(lapply(l, FUN = function(x){all(!is.na(suppressWarnings(as.numeric(x))))}))
l.id
a b
TRUE FALSE
l[l.id] <- lapply(l[l.id], FUN = as.numeric)
l
$a
[1] 1 1
$b
[1] "a" "b"
Run Code Online (Sandbox Code Playgroud)
所以我只是想知道是否有人有一个更简化和优雅的解决方案建议.
谢谢!
一种选择是检查向量中的所有元素是否只有数字,如果是,则转换为numeric或保持相同.
lapply(l, function(x) if(all(grepl('^[0-9.]+$', x))) as.numeric(x) else x)
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用type.convert自动转换class,但character矢量将转换为factor类.
lapply(l, type.convert)
Run Code Online (Sandbox Code Playgroud)