Заменить предыдущие экземпляры во фрейме данных из столбца индексов - PullRequest
1 голос
/ 07 октября 2019

Привет У меня есть вопрос, похожий на [текст] ( Заменить значения во фрейме данных из столбца индексов ) У меня есть фрейм данных, который выглядит следующим образом.

COL1 <- c(1,1,1,NA,1,1)
COL2 <- c(1,NA,NA,1,1,1)
COL3 <- c(1,1,1,1,1,1)
index <- c(2,3,2,3,2,2)
Data <- data.frame (COL1, COL2, COL3, index)
Data
COL1 COL2 COL3 index
1    1    1    2
1    NA   1    3
1    NA   1    2
NA   1    1    3
1    1    1    2
1    1    1    2

Где «индекс» говорит мне определенный порог. Для каждой строки я хотел бы заменить все значения столбца до значения, указанного в «индексе», на уникальное значение, например, 99. Таким образом, я хотел бы получить что-то вроде

COL1 COL2 COL3
99   99   1
99   99   99
99   99   1
99   99   99
99   99   1
99   99   1

Из предыдущего вопроса ответизменить экземпляры после "index" будет

t(apply(Data, 1, function(x) {
  i1 <- match( x[4], names(x)[-4])+1
  i1[i1>3] <- 0
  i1 <- if(i1!=0) i1:3 else i1
  c(replace(x[-4], i1, 99), x[4])}))

Однако это приводит меня к ошибкам

"Ошибка в случае (i1! = 0) i1: 3 или i1:пропущенное значение, где требуется ИСТИНА / ЛОЖЬ "

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Здесь есть один вариант с apply, где мы перебираем строки (MARGIN = 1), replace значения каждой строки, создавая условие на основе 4-го столбца значения и присваивая ему значение 99

t( apply(Data, 1, function(x) replace(x, seq_along(x) <= x[4], 99)))[,-4]
#     COL1 COL2 COL3
#[1,]   99   99    1
#[2,]   99   99   99
#[3,]   99   99    1
#[4,]   99   99   99
#[5,]   99   99    1
#[6,]   99   99    1

Или с векторизованным подходом, создавая логическую матрицу на основе индекса col и столбца «индекс» «Данные» до replace значений первых 3 столбцов с 99

replace(Data[1:3], col(Data[1:3]) <= Data$index, 99)
#  COL1 COL2 COL3
#1   99   99    1
#2   99   99   99
#3   99   99    1
#4   99   99   99
#5   99   99    1
#6   99   99    1
2 голосов
/ 07 октября 2019
replace(Data, cbind(rep(1:NROW(Data), Data$index), sequence(Data$index)), 99)
#  COL1 COL2 COL3 index
#1   99   99    1     2
#2   99   99   99     3
#3   99   99    1     2
#4   99   99   99     3
#5   99   99    1     2
#6   99   99    1     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...