2015-09-29 17 views
6

Sayısal olarak dönüştürmek istediğim karakterleri içeren bir liste döndüren bir işlev var. Çoğu zaman, listenin tüm öğeleri kolayca sayısal olarak zorlanabilir:As.numerik'in yalnızca nümerik olarak (R olarak) kodlanabilecek öğelerin öğelerine uygulanması (R)

ve böylece basit bir lapply(x, FUN = as.numeric) düzgün çalışıyor.

örn.

ör:

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 

Bununla birlikte, bazı durumlarda, vektörler doğru karakter içeren

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 

Ben çalışmalarla gelmiş çözüm ama biraz dolambaçlı hisseder: Orada kimse önermek için daha akıcı ve zarif bir çözüm olsaydı

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" 

Yani sadece merak ediyordum.

Teşekkürler!

cevap

7

Vektörlerdeki tüm öğelerin yalnızca sayılara sahip olup olmadığını ve eğer varsa numeric'a dönüştürüp dönüştürmeyeceğini ya da aynı kalmayı deneyip denetlemeyeceğinizi bir seçenek.

lapply(l, function(x) if(all(grepl('^[0-9.]+$', x))) as.numeric(x) else x) 

Ya da otomatik olarak class dönüştürmek için type.convert kullanabilirsiniz ancak character vektörler factor sınıfa dönüştürülecektir.

lapply(l, type.convert) 
+0

i ile gelip 'lapply (l, function (x) {(grepl ("^ \\ d + $", x), as.numeric (x) x) ifelse})' ne bütün anlamına geliyor? –

+0

@AvinashRaj Ayrıca kullanılabileceğini düşünüyorum, ancak karışık sınıf varsa, uyarılarla ortaya çıkacaktır. yani l $ a [2] <- 'a'' – akrun

+0

@akrun Benim durumumda, ilk seçenek en uygun ancak gelecekteki referans için ikinci seçeneği bilmek iyidir. –

3

Ayrıca bu başka bir şey dönüştürmez

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

gibi bir şey yapabileceğini zaman type.convert() bir sayısal sonuçlar. Ya da, bu basit durum için as.is = TRUE'u kullanabiliriz, ancak bunun her zaman bize istediğimizi vermeyeceğini unutmayın.

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