【问题标题】:Why does my lead-function generate NA values?为什么我的前导函数会生成 NA 值?
【发布时间】:2019-12-02 12:55:42
【问题描述】:

我必须构建一个参考表来跟踪我们的学生在当前日期应该获得多少学分。每个入场轮次和课程我都有一排。

我想编写一个 finished-变量,该变量在每个入学轮的最后一门课程中取值为 1,对于其他每个值取值为 0(这将让我处理应该完成课程的学生已经)。

我写

ekon_program<-ekon_program%>%mutate(finished=ifelse(lead(kull)=kull,0,1))

其中kull 是我的admissionround 变量,它将在当前admissionround 的最后一门课程之后的行中改变+1。奇怪的是,每轮录取的最后一门课程现在编码为“NA”,但所有其他值都编码为 0。

我可以通过将所有 NA 值转换为 1 来轻松纠正此问题,但为什么会发生这种情况?

数据摘录:

ekon_program <- structure(list(sd = structure(c(17042, 17042, 17042, 17042, 17042, 
17042, 17042, 17042, 17042, 17042, 17042, 17042, 17042, 17042, 
17406, 17406, 17406, 17406, 17406, 17406), class = "Date"), points_ekon = c(15, 
15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 15, 15, 30, 0, 15, 15, 
15, 15, 7.5, 7.5), summer_break_ekon = c(0, 0, 0, 0, 1, 1, 1, 
1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1), weeks_course = c(10, 
10, 10, 10, 5, 5, 10, 5, 5, 10, 10, 10, 20, 0, 10, 10, 10, 10, 
5, 5), points_expected = c(0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 
105, 120, 135, 150, 180, 0, 15, 30, 45, 60, 67.5), order = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 1L, 
2L, 3L, 4L, 5L, 6L), starttermin = c(1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0), kull = c(1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), start_date = structure(c(17041, 
17041, 17041, 17041, 17041, 17041, 17041, 17041, 17041, 17041, 
17041, 17041, 17041, 17041, 17405, 17405, 17405, 17405, 17405, 
17405), class = "Date"), start_date_points = structure(c(17041, 
17132, 17202, 17272, 17342, 17461, 17496, 17566, 17601, 17636, 
17706, 17860, 17930, 18070, 17405, 17496, 17566, 17636, 17706, 
17825), class = "Date"), end_date_points = structure(c(17131, 
17201, 17271, 17341, 17460, 17495, 17565, 17600, 17635, 17705, 
17859, 17929, 18069, 18069, 17495, 17565, 17635, 17705, 17824, 
17859), class = "Date"), finished_date = structure(c(18070, 18070, 
18070, 18070, 18070, 18070, 18070, 18070, 18070, 18070, 18070, 
18070, 18070, 18070, 18434, 18434, 18434, 18434, 18434, 18434
), class = "Date")), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -20L), groups = structure(list(
    start_date = structure(c(17041, 17405), class = "Date"), 
    .rows = list(1:14, 15:20)), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE))

【问题讨论】:

    标签: r lead


    【解决方案1】:

    一个问题是=不是==,其次lead by default在最后创建了一个NA,如果我们需要更改,更改default。另外,我们不需要ifelse强制,可以用as.integer完成

    library(dplyr)
    ekon_program %>%
       mutate(finished = as.integer(lead(kull, default = last(kull)) != kull))
    

    【讨论】:

    • 如果我正确解释了这个答案,除非另有说明,否则领先功能将(出于某种未知原因)将组中的最后一个值(在这种情况下为 admissionround)视为 NA?我不明白这条规则的含义,但是当我将默认值设置为 0 时,它“确实”似乎起作用了。
    • @Magnus lead(1:5)#[1] 2 3 4 5 NA 最后一个值是default = NA 我将NA 更改为另一个值,因为== 在与NA 进行比较时返回NA,即@987654336 @
    • 当然,如果前导值不存在(例如前导值在 1:5 中变为 5)我可以理解,但是....现在我们真的“拥有”前导值下一组?我将此标记为正确答案,谢谢您的宝贵时间!
    • @Magnus 如果您需要在每个组中使用此功能,则在应用 tat 之前需要group_by。当lag 执行相反的操作时,lead 将删除第一个观察并移动值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多