2015-11-03 56 views
0

我使用unname加上一些其它內置函數搶在字符串中的第二數字表示像這樣的時刻:řunname()示出了在結果從vapply返回沒有影響()

v = vapply(vec, function(x) { 
    as.numeric(unname(strsplit(x, ":")[[1]][1])) 
}, 1) 

的問題是,現在這個命名輸出返回:

19:22 13:30 13:30 17:00 19:20 17:00 14:15 17:00 13:30 19:15 
    19 13 13 17 19 17 14 17 13 19 

我用這與肥胖型data.table所以我想這樣做的效率,即不用跑unname兩次。 爲什麼unname以上不起作用? 下面是我試過到目前爲止做:

  • unname交換順序和as.numeric

這裏是vec樣子:

> vec 
[1] "19:22" "13:30" "13:30" "17:00" "19:20" "17:00" "14:15" "17:00" "13:30" "19:15" 
+0

順便說一句,如果你總是想要前兩個字符,你可以使用'substring' –

+0

@alexis_laz謝謝。不幸的是,0-9只使用1個字符而不是2,所以子串不能單獨工作。 – sunny

+0

你也可以像'as.numeric(sapply(strsplit(vec,「:」,fixed = TRUE),「[[」,1L))''以避免使用'strsplit'和'as.numeric'你的'vapply'循環。 –

回答

0

我的猜測是unname正在工作,但vapply本身可以說是「最終發言權」,並且因爲它的USE.NAMES默認爲TRUE,所以您將獲得姓名。例如,

R> (v <- vapply(vec, function(x) { 
    as.numeric(unname(strsplit(x, ":")[[1]][1])) 
}, 1, USE.NAMES = FALSE)) 
#[1] 19 13 13 17 19 17 14 17 13 19 
## 
R> (v2 <- vapply(vec, function(x) { 
    as.numeric(strsplit(x, ":")[[1]][1]) 
}, 1, USE.NAMES = FALSE)) 
#[1] 19 13 13 17 19 17 14 17 13 19 

所以,你真的甚至不需要使用unname,作爲第二個例子展品。

0

您可以使用sapply

vec<-c("19:22", "13:30" ,"13:30" ,"17:00", "19:20", "17:00" ,"14:15", "17:00", "13:30" ,"19:15") 
as.numeric(sapply(vec,function(x){strsplit(x,':')[[1]][1]})) 

[1] 19 13 13 17 19 17 14 17 13 19 
+0

感謝您的評論,但我想盡可能使用更快的vapply。我應該在我的問題中指出這一點。 – sunny