r - dplyr 变异返回 NA 而 sapply 不带有 strsplit

标签 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 的函数,它们都只返回 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/

相关文章:

r - 转换为正确的大小写,除非它是 R 中的 TLA

r - model.matrix 如何为交互项选择级别

r - Puppet 不使用新的 deb 源来安装最新版本的 R

r - 如何从 R 中的 GLM 调用中检索原始变量名称的列表?

r - R 中的图像平滑

r - 使用 R dplyr 链获取最频繁因子的值

R - dplyr - 根据多个条件过滤 top_n 行

r - ddply -> dplyr : . fun = 用几行总结

R:read_excel 将日期读取为数字

r - 基于特定条件进行过滤和添加的有效方法(本例中为 3 个条件)