【问题标题】:dplyr function returning false NAsdplyr 函数返回错误的 NA
【发布时间】:2018-06-05 23:43:00
【问题描述】:

我有与here 发布的相同的问题,但问题仍未得到解答,我也遇到了同样的问题。

我附上了我的数据样本here

我使用的R版本是3.4.2,dplyr版本是0.7.4。

为了让每个人都能快速... 导入数据后,我进行以下编辑:

#specify which species are predators (pp = 1) and prey (pp = 0)
d1 = d1 %>%
    group_by(sps) %>% #grouped by species
    mutate(pp=ifelse(sps %in% c("MUXX", "MUVI","MEME"), 1,0)) #mutate to specify predators as 1 and prey as 0

d1$datetime=strftime(paste(d1$date,d1$time),'%Y-%m-%d %H:%M',usetz=FALSE) #converting the date/time into a new format 

head(d1) #visualize the first few lines of the data

d2 = d1 %>% filter(km %in% c("80")) #restricting the observations to just one location (km 80)

现在是问题出现的地方(NA):

d2 = d2 %>% mutate(prev = dplyr::lag(pp)) 
#when I look at the output I see the lag function isn't working (shown below)

> d2
# A tibble: 209 x 10
# Groups:   sps [10]
  ID       date    km culv.id   type    sps   time    pp         datetime  prev
<int>     <fctr> <dbl>  <fctr> <fctr> <fctr> <fctr> <dbl>            <chr> <dbl>
1     1 2012-06-19    80       A    DCC  MICRO   2:19     0 2012-06-19 02:19    NA
2     2 2012-06-21    80       A    DCC   MUXX  23:23     1 2012-06-21 23:23    NA
3     3 2012-07-15    80       A    DCC   MAMO  11:38     0 2012-07-15 11:38    NA
4     4 2012-07-20    80       A    DCC  MICRO  22:19     0 2012-07-20 22:19     0
5     5 2012-07-29    80       A    DCC  MICRO  23:03     0 2012-07-29 23:03     0
6     8 2012-08-07    80       A    DCC   PRLO   2:04     0 2012-08-07 02:04    NA
7     9 2012-08-08    80       A    DCC  MICRO  23:56     0 2012-08-08 23:56     0
8    10 2012-08-09    80       A    DCC   PRLO  23:06     0 2012-08-09 23:06     0
9    11 2012-08-13    80       A    DCC  MICRO   0:04     0 2012-08-13 00:04     0
10   12 2012-08-13    80       A    DCC  MICRO   0:46     0 2012-08-13 00:46     0

可能有人对为什么滞后功能不起作用有任何建议吗?

【问题讨论】:

  • d2 &lt;- d2 %&gt;% ungroup() %&gt;% mutate(prev = dplyr::lag(pp))
  • @Mako212 这立即解决了我的问题!谢谢!!!如果可能的话,您能否向我解释一下您注意到我的输出中发生了什么,以便在再次出现这个问题时我可以自己解决这个问题?
  • 添加了我的评论作为更详细的答案。
  • 对 NA 的实际情况做了最后的说明,您可能实际上不想 ungroup() 因为 lag() 在分组数据帧上正常工作,如果您希望按组获得滞后值.

标签: r datetime dplyr time-series


【解决方案1】:

在您之前的一个操作中,您指定了group_by(sps),该组将一直连接到您的数据框,直到您ungroup()。某些行级别的操作不会受到组的影响,但聚合函数和基于多行值计算的函数会​​受到影响。

d2 <- d2 %>% ungroup() %>% mutate(prev = dplyr::lag(pp))

另外,关于我注意到的:

  1. 我在你的标题里看到了# Groups: sps [10]
  2. 每个sps 值的第一个实例为 NA,但每个的第二个实例正确为 0

然而,作为最终编辑,lag() 的第一个值将始终为 NA,因为没有先前的值。 group_by(sps) 也是如此,但这意味着您将有 10 个 NA 值,一个用于每个因子级别的第一个实例。如果您想要组内的滞后值,那么您不应该 ungroup() 并且该函数正在正常工作,创建这些 NA。您可以将这些 NA 替换为 0 或其他值(如果适用)。

【讨论】:

  • 感谢您的澄清。当我在mutate() 函数之前指定ungroup() 时,我可以在之后再次group_by(sps) 吗?或者这可能会导致问题?
  • @BlunderingEcologist 你绝对可以,组只影响它所在位置的计算,所以如果你取消组合,你可以执行任意数量的未组合操作,直到你再次组合。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2016-01-10
  • 2020-06-04
  • 2014-04-19
  • 2021-05-03
  • 2016-10-08
  • 1970-01-01
相关资源
最近更新 更多