@ Тимминатор с небольшой модификацией переменной names
и for
l oop, как показано ниже:
names <- c("'B'","'D'","'E'")
#
for(j in 1:length(names)){
for(i in 2:nrow(df)){
if(df[i,names[j]] == '' & df[i,1] == df[i-1,1]){
df[i,names[j]] <- df[i-1,names[j]]
}
}
}
Мы можем получить следующий желаемый результат
> df
'A' 'B' 'C' 'D' 'E'
1 1 50 'ABCD' 10 20
2 1 50 'JNHF' 10 20
3 1 50 'edfw' 10 20
4 2 100 'b984'
5 2 100 'abcd'
6 2 100 'abcd'
7 3 'abcd' 24
8 3 'b984' 24
9 4 25 'JNHF'
10 4 25 'JNHF'
11 4 25 'b984'
Использование следующих данных в качестве ввода
df<- structure(list("'A'" = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L,4L),
"'B'" = c("50", "", "", "100", "", "", "", "", "25", "", ""),
"'C'" = structure(c(2L, 7L, 6L, 1L, 4L, 4L, 4L, 5L, 3L, 7L, 5L
), .Label = c("'b984'", "'ABCD'", "'JNHF'", "'abcd'",
"'b984'", "'edfw'", "'JNHF'"), class = "factor"),
"'D'" = c("10", "", "", "", "", "", "24", "", "", "", ""),
"'E'" = c("20","", "", "", "", "", "", "", "", "", "")), row.names = c(NA,-11L), class = "data.frame")