Updating cells with other rows' data

This post has been removed by the author

A non-tidyverse solution:

library(tibble)
#> Warning: package 'tibble' was built under R version 3.5.3
library(dplyr)
df <- tibble::tribble(
  ~RequestID, ~PiggybackID, ~PiggybackOrder, ~IsJrPiggy, ~value,
  1,          100,               0,      FALSE,    1.5,
  2,          100,               1,       TRUE,    1.5,
  3,          100,               2,       TRUE,    1.5,
  4,          101,               0,      FALSE,      2,
  5,          101,               1,       TRUE,     NA,
  6,          102,               0,      FALSE,      3,
  7,          102,               1,       TRUE,      3,
  8,          103,               0,      FALSE,    1.5,
  9,          103,               1,       TRUE,     NA,
  10,          103,               2,       TRUE,     NA
)
Seniors <- df %>%  filter(PiggybackOrder == 0)
SeniorsVec <- Seniors$value
names(SeniorsVec) <- Seniors$PiggybackID
df$value <- SeniorsVec[as.character(df$PiggybackID)]
df
#> # A tibble: 10 x 5
#>    RequestID PiggybackID PiggybackOrder IsJrPiggy value
#>        <dbl>       <dbl>          <dbl> <lgl>     <dbl>
#>  1         1         100              0 FALSE       1.5
#>  2         2         100              1 TRUE        1.5
#>  3         3         100              2 TRUE        1.5
#>  4         4         101              0 FALSE       2  
#>  5         5         101              1 TRUE        2  
#>  6         6         102              0 FALSE       3  
#>  7         7         102              1 TRUE        3  
#>  8         8         103              0 FALSE       1.5
#>  9         9         103              1 TRUE        1.5
#> 10        10         103              2 TRUE        1.5

Created on 2019-12-27 by the reprex package (v0.3.0.9000)

1 Like

Maybe you have oversimplified your issue, but it seems like all values are the same within each piggyback, so if that is actually the case, you could use tidyr::fill() and have a much simpler solution.

library(tidyverse)

df <- tibble::tribble(
    ~RequestID, ~PiggybackID, ~PiggybackOrder, ~IsJrPiggy, ~value,
    1,          100,               0,      FALSE,    1.5,
    2,          100,               1,       TRUE,    1.5,
    3,          100,               2,       TRUE,    1.5,
    4,          101,               0,      FALSE,      2,
    5,          101,               1,       TRUE,     NA,
    6,          102,               0,      FALSE,      3,
    7,          102,               1,       TRUE,      3,
    8,          103,               0,      FALSE,    1.5,
    9,          103,               1,       TRUE,     NA,
    10,          103,               2,       TRUE,     NA
)

df %>% 
    group_by(PiggybackID) %>% 
    fill(value, .direction = "down")
#> # A tibble: 10 x 5
#> # Groups:   PiggybackID [4]
#>    RequestID PiggybackID PiggybackOrder IsJrPiggy value
#>        <dbl>       <dbl>          <dbl> <lgl>     <dbl>
#>  1         1         100              0 FALSE       1.5
#>  2         2         100              1 TRUE        1.5
#>  3         3         100              2 TRUE        1.5
#>  4         4         101              0 FALSE       2  
#>  5         5         101              1 TRUE        2  
#>  6         6         102              0 FALSE       3  
#>  7         7         102              1 TRUE        3  
#>  8         8         103              0 FALSE       1.5
#>  9         9         103              1 TRUE        1.5
#> 10        10         103              2 TRUE        1.5

Created on 2019-12-27 by the reprex package (v0.3.0.9000)

2 Likes

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.