dplyr mutate返回NA wheras sapply并不是strsplit

时间:2017-03-29 17:08:31

标签: r dplyr

我正在使用kaggle titanic数据集,其中列Cabin是类字符。我使用下面显示的函数来获取每个Cabin的第一个元素。

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来完成相同的任务时,我只得到了一列用于甲板的NA。这些是我尝试使用mutate的函数,并且都返回了NAs。

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

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

mutate有什么问题,或者我做错了什么?

1 个答案:

答案 0 :(得分: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