我正在使用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有什么问题,或者我做错了什么?
答案 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