【问题标题】:dplyr rowwise mutate with custom function returns unexpected NA使用自定义函数的 dplyr rowwise mutate 返回意外的 NA
【发布时间】:2016-10-22 07:40:09
【问题描述】:

我有一个包含两列的数据集,我想使用 dplyr rowwise mutate 和一个自定义函数将它们组合成一列。奇怪的是,对于匹配某个模式的第二行(但不是第一行或后续),我得到 NA 作为返回值。下面是一个例子:

my.func <- function(alpha, beta) {
  if(!is.na(beta) & beta) {
    return("c")
  } else if(is.na(alpha)) {
    return(as.character(NA))
  } else if (alpha == "a") {
    return("a")
  } else if (alpha == "b") {
    return("b")
  } else {
    return(as.character(NA))
  }
}

tmp <- data.frame(obs = 1:7,
                  dt = c('2016-03-15 17:35:46','2016-03-15 18:45:47','2016-03-15 19:22:17','2016-03-15 19:23:45','2016-03-15 20:21:55','2016-03-15 21:20:10','2016-03-15 22:18:34'),
                  one = c(NA,"a","a","a","b","a","b"), two = c(NA,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE))

tmp2 <- tmp %>% rowwise() %>% mutate(three = my.func(one, two))

这会导致第三行第三列中的 NA,而对于上面的行,使用完全相同的输入,它会导致“a”。

【问题讨论】:

  • 您是指第三个打印行还是行名为“3”的行?行名为“1”的行是我运行它时唯一的 NA 值,这完全是预期的。 (我认为您指的是第 5 列。)是时候进行版本检查了?
  • 我有 dplyr 版本 0.4.3.9001
  • 对此我真的很困惑。 mapply(my.func, tmp$one, tmp$two) 提供正确的结果。如果您更改第一个NA,它也会变得正确......也许它与rowwise()有关。
  • 这个报告的问题似乎符合异常结果:github.com/hadley/dplyr/issues/1908
  • @42- 为了澄清我的意思是第三行和第五列,称为“三”。对困惑感到抱歉。我有 dplyr 版本 0.4.3。我会升级。感谢您的帮助

标签: r dplyr


【解决方案1】:

我不明白为什么您的代码不起作用,但以下内容似乎符合您的预期:

tmp2 <- tmp %>% mutate(three = mapply(my.func, one, two))

>tmp2

  obs                  dt  one   two three
1   1 2016-03-15 17:35:46 <NA>    NA  <NA>
2   2 2016-03-15 18:45:47    a FALSE     a
3   3 2016-03-15 19:22:17    a FALSE     a
4   4 2016-03-15 19:23:45    a FALSE     a
5   5 2016-03-15 20:21:55    b FALSE     b
6   6 2016-03-15 21:20:10    a  TRUE     c
7   7 2016-03-15 22:18:34    b FALSE     b

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多