dplyr rowwise mutate with自定义函数返回意外NA

dplyr rowwise mutate with自定义函数返回意外NA,r,dplyr,R,Dplyr,我有一个包含两列的数据集,我想使用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)) }

我有一个包含两列的数据集,我想使用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))

my.func我不太明白你的代码为什么不起作用,但下面的内容似乎符合你的期望:

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
tmp2%突变(三=mapply(my.func,一,二))
>tmp2
obs dt一二三
1112016-03-1517:35:46北美
2 2016-03-15 18:45:47 a假a
3 2016-03-15 19:22:17 a假a
4 4 2016-03-15 19:23:45 a假a
5 5 2016-03-15 20:21:55 b假b
6 2016-03-15 21:20:10真正的c
7 7 2016-03-15 22:18:34 b假b

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

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
tmp2%突变(三=mapply(my.func,一,二))
>tmp2
obs dt一二三
1112016-03-1517:35:46北美
2 2016-03-15 18:45:47 a假a
3 2016-03-15 19:22:17 a假a
4 4 2016-03-15 19:23:45 a假a
5 5 2016-03-15 20:21:55 b假b
6 2016-03-15 21:20:10真正的c
7 7 2016-03-15 22:18:34 b假b

您是指第三个打印行还是行名为“3”的行?rowname为“1”的行是我运行它时唯一的NA值,这完全是意料之中的。(我想你指的是第5栏。)是时候进行版本检查了?我有dplyr版本0.4.3.9001,对此我真的很困惑
mapply(my.func,tmp$one,tmp$two)
提供正确的结果。如果你改变了第一个
NA
,它也会变得正确。。。也许这与
rowwise()
有关。这个报道的问题似乎符合反常的结果:@42-澄清一下,我指的是第三行和第五列,称为“三”。很抱歉给你带来了困惑。我有dplyr版本0.4.3。我会升级。谢谢您的帮助您是指第三行还是行名为“3”的行?rowname为“1”的行是我运行它时唯一的NA值,这完全是意料之中的。(我想你指的是第5栏。)是时候进行版本检查了?我有dplyr版本0.4.3.9001,对此我真的很困惑
mapply(my.func,tmp$one,tmp$two)
提供正确的结果。如果你改变了第一个
NA
,它也会变得正确。。。也许这与
rowwise()
有关。这个报道的问题似乎符合反常的结果:@42-澄清一下,我指的是第三行和第五列,称为“三”。很抱歉给你带来了困惑。我有dplyr版本0.4.3。我会升级。谢谢你的帮助