我正在使用 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 的函数,它们都只返回 NA。
df %>% mutate(deck = ifelse(is.na(Cabin),Cabin, strsplit(Cabin,NULL)[[1]][1]))
和
df %>% mutate(deck = strsplit(Cabin,NULL)[[1]][1])
mutate 有问题还是我只是做错了什么?
最佳答案
我相信答案与什么对象有关 strsplit
当你以两种不同的方式调用它时,它就会起作用。
来自 strsplit
的文档,它返回
A list of the same length as x, the i-th element of which contains the vector of splits of 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
关于r - dplyr 变异返回 NA 而 sapply 不带有 strsplit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43099888/