【问题标题】:Retaining the last value of a column保留列的最后一个值
【发布时间】:2020-09-22 12:50:39
【问题描述】:

我有以下数据框,

Input

对于月份 > 期限​​的所有观测值,应为每个帐户保留剩余月份的费率列的最后一个值。例如:- 客户 1 的期限 = 5,因此对于所有大于 5 的月份,将保留最后一个费率值。

我正在使用以下代码

df$rate <- ifelse(df$Month > df$tenor,tail(df$rate, n=1),df$rate)

但是在这里,最后一个值是 NA 所以它不起作用

预期输出是

Output

【问题讨论】:

  • 请使用dput添加数据,而不是图片。阅读how to ask a good question 以及如何提供reproducible example
  • 您向我们展示的不是您的数据框。它是您的数据框的图片。这意味着如果有人想尝试使用您的样本数据来创建答案,他们将不得不费力地手工转录您的图片。如果您将数据发布为人们可以复制和粘贴的文本,您更有可能获得有用的答案。请参阅@RonakShah 提供的链接,向您展示如何轻松做到这一点。谢谢。

标签: r


【解决方案1】:

这可行,但请提供一个可重现的示例。别人想帮助你,而不是做你的功课。

df <- data.frame(
    customer = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
    Month = c(1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10),
    tenor = c(5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3),
    rate = c(0.2,0.3,0.4,0.5,0.6,NA,NA,NA,NA,NA,0.1,0.2,0.3,NA,NA,NA,NA,NA,NA,NA)
)


fn <- function(cus, mon, ten, rat){
    if (mon > ten & is.na(rat)){
        return(dplyr::filter(df, customer == cus, Month == ten, tenor == ten)$rate)
    }
        return(rat)
}


df2 <- mutate(df, 
    newrate = Vectorize(fn)(customer, Month, tenor, rate)
)

【讨论】:

    【解决方案2】:

    一个选项是:

    library(dplyr)
    library(tidyr)
    df %>%
        group_by(cus_no) %>%
        fill(rate, .direction = "down") %>%
        ungroup()
    # A tibble: 20 x 4
       customer Month tenor  rate
          <dbl> <dbl> <dbl> <dbl>
     1        1     1     5   0.2
     2        1     2     5   0.3
     3        1     3     5   0.4
     4        1     4     5   0.5
     5        1     5     5   0.6
     6        1     6     5   0.6
     7        1     7     5   0.6
     8        1     8     5   0.6
     9        1     9     5   0.6
    10        1    10     5   0.6
    11        2     1     3   0.1
    12        2     2     3   0.2
    13        2     3     3   0.3
    14        2     4     3   0.3
    15        2     5     3   0.3
    16        2     6     3   0.3
    17        2     7     3   0.3
    18        2     8     3   0.3
    19        2     9     3   0.3
    20        2    10     3   0.3
    

    【讨论】:

      【解决方案3】:

      我无法复制您的数据框,所以现在只是猜测。 我认为dplyr 应该是解决方案:-

      library(dplyr)
      
      df%>%
      group_by(Month)%>%
      replace_na(last(rate))
      
      
      

      应该工作

      【讨论】:

        最近更新 更多