【问题标题】:Is there a way to add rows to an r dataframe which default to inheriting the previous row's value?有没有办法将行添加到默认继承前一行值的 r 数据框?
【发布时间】:2018-06-20 20:44:00
【问题描述】:

提前感谢您回答这个问题,因为这是我第一次在这里提问,所以我将接受改进我的问题的提示!

我正在将数据从我们的 SQL Server 提取到一个 r-Notebook 到一个数据框中,该数据框附加到接收季度评估的客户身上,这种情况从那时起就一直在发生2015 年第四季度到 2018 年第二季度。问题是,评估并不总是进行,因此数据存在差距。例如,我目前正在创建一个如下所示的数据框:

client name | assessment date | assessment value
client 1    | 2015 Q4         | Green
client 1    | 2018 Q1         | Green
client 2    | 2015 Q4         | Yellow
client 2    | 2016 Q2         | Green
client 2    | 2016 Q4         | Green
client 2    | 2017 Q1         | Yellow

基本上,我需要每个客户名称记录 2015 年第四季度至 2018 年第二季度之间的每个季度。我将假设尚未进行评估,那么评估值从以前的评估将是默认的。数据框最终应该是这样的:

client name | assessment date | assessment value
client 1    | 2015 Q4         | Green
client 1    | 2016 Q1         | Green
client 1    | 2016 Q2         | Green
client 1    | 2016 Q3         | Green
client 1    | 2016 Q4         | Green
client 1    | 2017 Q1         | Green
client 1    | 2017 Q2         | Green
client 1    | 2017 Q3         | Green
client 1    | 2017 Q4         | Green
client 1    | 2018 Q1         | Green
client 1    | 2018 Q2         | Green
client 2    | 2015 Q4         | Yellow
client 2    | 2016 Q1         | Yellow
client 2    | 2016 Q2         | Green
client 2    | 2016 Q3         | Green
client 2    | 2016 Q4         | Green
client 2    | 2017 Q1         | Yellow
client 2    | 2017 Q2         | Yellow
client 2    | 2017 Q3         | Yellow
client 2    | 2017 Q4         | Yellow
client 2    | 2018 Q1         | Yellow
client 2    | 2018 Q2         | Yellow

谢谢!

【问题讨论】:

  • 使用 tidyr::expand 为所有可能的组合创建行,然后使用此站点上的众多“最后一次观察结转”(LOCF) 解决方案之一来更新缺失值。
  • 我还建议您考虑仅对缺失值使用NA,并且仅在您需要对需要这种解决方案的数据执行某些操作时才使用 LOCF 解决方案。

标签: r sql-server-2008 rnotebook


【解决方案1】:

根据@MrFlick 的建议,我想试一试,因为我之前没有使用过expand

library(tidyr)
library(dplyr)
library(zoo)

df <- data.table::fread("client name | assessment date | assessment value
                        client 1    | 2015 Q4         | Green
                        client 1    | 2018 Q1         | Green
                        client 2    | 2015 Q4         | Yellow
                        client 2    | 2016 Q2         | Green
                        client 2    | 2016 Q4         | Green
                        client 2    | 2017 Q1         | Yellow")

df <- df %>% 
  mutate(qtr = as.yearqtr(`assessment date`))

df2 <- expand(df,  client = `client name`,
                   qtr = seq(min(qtr), max(qtr), by = 0.25)) %>%
  arrange(client, qtr)

df2 %>% 
  mutate(qtr = as.character(qtr)) %>%
  left_join(df %>% mutate(qtr = as.character(qtr)),
            by = c('client' = 'client name', 'qtr' = 'qtr')) %>%
  group_by(client) %>%
  fill(`assessment value`) %>%
  select(-`assessment date`)

# A tibble: 20 x 3
# Groups:   client [2]
   client   qtr     `assessment value`
   <chr>    <chr>   <chr>             
 1 client 1 2015 Q4 Green             
 2 client 1 2016 Q1 Green             
 3 client 1 2016 Q2 Green             
 4 client 1 2016 Q3 Green             
 5 client 1 2016 Q4 Green             
 6 client 1 2017 Q1 Green             
 7 client 1 2017 Q2 Green             
 8 client 1 2017 Q3 Green             
 9 client 1 2017 Q4 Green             
10 client 1 2018 Q1 Green             
11 client 2 2015 Q4 Yellow            
12 client 2 2016 Q1 Yellow            
13 client 2 2016 Q2 Green             
14 client 2 2016 Q3 Green             
15 client 2 2016 Q4 Green             
16 client 2 2017 Q1 Yellow            
17 client 2 2017 Q2 Yellow            
18 client 2 2017 Q3 Yellow            
19 client 2 2017 Q4 Yellow            
20 client 2 2018 Q1 Yellow     

我不得不修改 yearqtr 类型并将其转换为 character 以在加入期间保留所有信息。可能有一种更清洁的方法可以做到这一点,但希望它能为您指明正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多