2017-03-29 56 views
2

我正在使用kggle泰坦尼克號數據集,其中列Cabin是類字符。我使用下面顯示的函數來獲取每個客艙的第一個元素。dplyr mutate返回NA wheras sapply不與strsplit

sapply(df$Cabin,function(x) strsplit(x,NULL)[[1]][1]) 

Cabin deck 
NA  NA 
C85  C 
NA  NA 
C123 C 
NA  NA 
E46  E 

但是,當我使用dplyr的mutate實現相同的任務,我只是得到甲板的NAs列。這些是我嘗試mutate的功能,都返回了NAs。

df %>% mutate(deck = ifelse(is.na(Cabin),Cabin, strsplit(Cabin,NULL)[[1]][1])) 

df %>% mutate(deck = strsplit(Cabin,NULL)[[1]][1]) 

是不是有什麼毛病發生變異或者我只是做錯了什麼?

回答

2

我相信當你稱之爲兩種不同的方式時,答案與對象strsplit的作用有關。

strsplit的文檔時,它返回

相同的長度爲x的清單,第i個元件,其包含X [I]的分割的 矢量。

當你調用sapply(df$Cabin,function(x) strsplit(x,NULL)[[1]][1])strsplit行爲分開矢量df$Cabin中的每個元素,所以就好像你打電話:

strsplit(df$Cabin[1], NULL)[[1]][1] 
# [1] NA 
strsplit(df$Cabin[2], NULL)[[1]][1] 
# [1] C 
... 

相比之下,mutate對整個向量調用strsplit,所以就好像你打電話strsplit(df$Cabin, NULL)

strsplit(df$Cabin, NULL) 
# [[1]] 
# [1] NA 
# 
# [[2]] 
# [1] "C" "8" "5" 
# 
# [[3]] 
# [1] NA 
# 
# [[4]] 
# [1] "C" "1" "2" "3" 
# 
# [[5]] 
# [1] NA 
# 
# [[6]] 
# [1] "E" "4" "6" 

我們可以從輸出中看到,strsplit(df$Cabin, NULL)[[1]][1]NA,所以無處不在。

要獲得所需的輸出,您可以使用substring,因爲所需的信息始終處於相同的位置。

df %>% 
    mutate(deck = substring(Cabin, 1, 1)) 
# Cabin deck 
# <NA> <NA> 
# C85 C 
# <NA> <NA> 
# C123 C 
# <NA> <NA> 
# E46 E