【问题标题】:dplyr mutate returning NA wheras sapply isn't with strsplitdplyr mutate 返回 NA 而 sapply 不与 strsplit
【发布时间】:2017-03-29 17:08:30
【问题描述】:

我正在使用 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])

变异有什么问题还是我做错了什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我相信答案与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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多