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

时间:2015-09-29 14:09:23

标签: r

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

所以一个简单的lapply(x, FUN = as.numeric)工作正常。

e.g。

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

但是,在某些情况下,矢量包含真实字符:

e.g。

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

我带来的解决方案有效,但感觉有点复杂:

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"

所以我只是想知道是否有人有更简洁和优雅的解决方案来建议。

谢谢!

2 个答案:

答案 0 :(得分:7)

一种选择是检查向量中的所有元素是否只有数字,如果是,则转换为$(document).ready(function() { var wrapper = $(".lines"); var add_button = $("#new_line"); $(add_button).click(function() { $(wrapper).append('<li><a href="#" class="dropdown-toggle">Popup</a> <ul class="dropdown-menu" style="background: #000; padding: 10px; display:none;">ddd</ul></li>'); $('.dropdown-toggle:last').click(function() { $('.dropdown-menu').not($(this).next('.dropdown-menu')).hide(); $(this).next('.dropdown-menu').toggle(); }); }); }); 或者保持不变。

numeric

或者,我们可以使用lapply(l, function(x) if(all(grepl('^[0-9.]+$', x))) as.numeric(x) else x) 自动转换type.convert,但class向量将转换为character类。

factor

答案 1 :(得分:3)

您也可以执行类似

的操作
lapply(l, function(x) if(is.numeric(t <- type.convert(x))) t else x)
# $a
# [1] 1 1
#
# $b
# [1] "a" "b"

除了来自type.convert()的数字结果之外,这不会转换任何其他内容。或者,对于这个简单的情况,我们可以使用as.is = TRUE,但请注意,这并不总能为我们提供我们想要的内容。

lapply(l, type.convert, as.is = TRUE)
# $a
# [1] 1 1
#
# $b
# [1] "a" "b"