Вот попытка использования tidyverse
.
library(tidyverse)
df %>%
group_by(rowID_new = replace(rowID, firstId != '', firstId[firstId != ''])) %>%
mutate(age = replace(age, age == '', age[age != ''])) %>%
ungroup() %>%
filter(!rowID %in% firstId) %>%
select(-rowID_new)
что дает,
# A tibble: 2 x 5
rowID name address age firstId
<dbl> <chr> <chr> <chr> <chr>
1 2 B E 72 ""
2 3 C F 60 1
EDIT:
Если вам нужно заполнить несколько переменных, мы можем заменить ''
на NA
и использовать fill
, т.е.
df %>%
mutate_all(function(i) replace(i, i == '', NA)) %>%
group_by(rowID_new = replace(rowID, !is.na(firstId), firstId[!is.na(firstId)])) %>%
fill(-rowID, .direction = 'up') %>% #you might not need this[with .direction = 'up']
fill(-rowID) %>%
ungroup() %>%
filter(!rowID %in% firstId)
, что дает,
# A tibble: 2 x 6
rowID name address age firstId rowID_new
<dbl> <chr> <chr> <chr> <chr> <chr>
1 3 C F 60 1 1
2 2 B E 72 <NA> 2
ИСПОЛЬЗОВАННЫЙ ПРИМЕР
structure(list(rowID = c(1, 2, 3), name = c("A", "B", "C"), address = c("D",
"E", "F"), age = c("60", "72", ""), firstId = c("", "", "1")), class = "data.frame", row.names = c(NA,
-3L))