2016-08-31 2 views
0

У меня есть большой набор данных df; его короткая версия выглядит следующим образом:Скопируйте значение строки в предыдущем ряду R

Time Block Accuracy 
6087.8 Run2 NA 
633.2 Run2 NA 
547  Run2 incorrect 
135.2 Run2 NA 
6217.6 Run2 NA 
175.2 Run2 NA 
179  Run2 incorrect 

Я хочу, чтобы скопировать значение неправильный в предыдущей строке ДФ $ точности, поэтому он будет выглядеть следующим образом:

Time Block Accuracy 
6087.8 Run2 NA 
633.2 Run2 incorrect 
547  Run2 incorrect 
135.2 Run2 NA 
6217.6 Run2 NA 
175.2 Run2 incorrect 
179  Run2 incorrect 

Что самое эффективный способ сделать это?

ответ

1

Чтобы увидеть строки, которые будут затронуты, запустите:

which(df$Accuracy == "incorrect")-1 

which() возвращает элементы вектора, которые являются истинными для конкретного логического выражения (в данном случае, значения которых в точности равны некорректным). Затем мы выберем 1 из каждого значения в векторе, чтобы получить предыдущие позиции строки.

Затем мы можем изменить их:

df[which(df$Accuracy == "incorrect")-1, "Accuracy"] <- "incorrect" 

Это находит все строки, как указано выше, и говорит: для тех строк и в графе «Точность», замените значения с «неправильным».

0

Вместо жесткого кодирования "incorrect", вы можете просто сделать значение ниже каждого NA, чтобы перейти вверх.

na_bool = is.na(df$Accuracy) 
df[na_bool,]$Accuracy = df[c(FALSE,na_bool[-length(na_bool)]),]$Accuracy 
Смежные вопросы