仅将as.numeric应用于可强制转换为数字的列表元素(在R中)

Ann*_*lli 6 r

我有一个函数,它返回一个包含单个字符向量的列表,我想将其转换为数字.大多数情况下,列表中的所有元素都可以轻松地强制为数字:

所以一个简单的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)

所以我只是想知道是否有人有一个更简化和优雅的解决方案建议.

谢谢!

akr*_*run 7

一种选择是检查向量中的所有元素是否只有数字,如果是,则转换为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)