Копировать предыдущую строку, если условие выполнено - PullRequest
0 голосов
/ 16 мая 2018

Мои данные

set.seed(123)
df <- data.frame(loc = rep(1:5, each = 5),value = sample(0:4, 25, replace = T))
a <- c("x","y","z","k")
df$id <- ifelse(df$value == 0, "no.data", sample(a,1))
head(df)

   loc value     id
1   1     1       z
2   1     3       z
3   1     2       z
4   1     4       z
5   1     4       z
6   2     0 no.data

Строки, для которых у меня нет данных, столбцы id и value имеют no.data и 0. Для всех строк, где у меня нет данных (id == no.data и value == 0), я хочу скопировать value и id из предыдущей строки.

    loc value   id
 1   1     1    z
 2   1     3    z
 3   1     2    z
 4   1     4    z
 5   1     4    z
 6   2     4    z

Что-то вроде:

df %>% group_by(loc) %>% mutate(value = ifelse(value == 0, copy the value from preceding row), id = ifelse(id== "no.data", copy the id from preceding row ))      

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Мы могли бы заменить 0s на NA, а затем сделать fill

library(tidyverse)
library(naniar)
df %>% 
   replace_with_na(replace = list(value = 0, id = "no.data")) %>% 
   fill(value, id)
0 голосов
/ 16 мая 2018

Если у вас нет очень большого набора данных, простой цикл должен сделать

for (r in 2:nrow(df)) {
  if (with(df[r, ], id == "no.data" && value == 0)) {
    df[r, c("id", "value")] <- df[r - 1L, c("id", "value")]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...