2017-03-29 6 views
2

私は、カブン列がクラス文字であるカラグルなチタンデータセットを扱っています。以下の関数を使用して各キャビンの最初の要素を取得しました。dplyr mutate戻り値なし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 

私はちょうどデッキのため、NASの列を取得し、同じタスクを達成するためにdplyrののmutateを使用しています。これらはmutateで試した関数で、どちらもNAを返すだけです。

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

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

のmutateまたは私はちょうど何か間違ったことをやっていると間違って何かがありますか?

答えて

2

答えは、あなたがそれを2つの異なる方法と呼んでいるときに、どのオブジェクトstrsplitが作用しているのかと考えています。

strsplitのドキュメントから、それは、x、xの分割の ベクトル[I]を含有するのi番目の要素として

同じ長さのリストを返します。

あなたが呼んでいるかのように、それはですので、別途ベクトルdf$Cabinの各要素に対してsapply(df$Cabin,function(x) strsplit(x,NULL)[[1]][1])strsplit行為を呼び出します。これとは対照的に

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" 

を呼んでいるかのようにそれはです3210はNAなので、どこにでもデータが取り込まれます。

希望の出力を得るには、希望の情報が常に同じ位置にあるので、substringを使用できます。

df %>% 
    mutate(deck = substring(Cabin, 1, 1)) 
# Cabin deck 
# <NA> <NA> 
# C85 C 
# <NA> <NA> 
# C123 C 
# <NA> <NA> 
# E46 E 
関連する問題