Подход
A tidyverse
, мы создаем индекс для gather
, присваивая row_number()
каждой строке. Затем мы group_by
каждые row
и находим первое не-NA значение в значениях row
и replace
каждые NA
до этого в 0, а все остальные значения NA
после этого в mean
. Наконец, spread
переменные возвращаются в широкий формат, удаляя ненужные столбцы, созданные во время вычисления.
library(tidyverse)
df %>%
mutate(row = row_number()) %>%
gather(key, value, -row) %>%
group_by(row) %>%
mutate(value1 = replace(value, is.na(value) & row_number() < which.max(!is.na(value)), 0),
value2 = replace(value1, is.na(value1), mean(value, na.rm = TRUE))) %>%
ungroup() %>%
select(-value1, -value) %>%
spread(key, value2) %>%
select(-row)
# Date1 Date2 Date3 Date4 Date5
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 0. 0.100 0.200 0.200 0.300
#2 0.100 0.200 0.200 0.300 0.200
#3 0. 0. 0. 0. 0.300
#4 0.100 0.200 0.300 0.100 0.175
#5 0. 0. 0.100 0.200 0.100
Базовый подход R с использованием apply
для каждой строки
t(apply(df, 1, function(x) {
inds <- which.max(!is.na(x))
x[inds:length(x)] <- replace(x[inds:length(x)], is.na(x[inds:length(x)]),
mean(x[inds:length(x)], na.rm = TRUE))
x[1:inds] <- replace(x[1:inds], is.na(x[1:inds]), 0)
x
}))
# Date1 Date2 Date3 Date4 Date5
#A 0.0 0.1 0.2 0.2 0.300
#B 0.1 0.2 0.2 0.3 0.200
#C 0.0 0.0 0.0 0.0 0.300
#D 0.1 0.2 0.3 0.1 0.175
#E 0.0 0.0 0.1 0.2 0.100