Я полагаю, что следующий код делает то, что вы хотите.
Создает новый столбец n2
со значениями n
, соответствующими первому вхождению T
в y
.
fun <- function(DF){
i <- grep("T", DF$y)[1]
DF$n2 <- DF$n
if(!is.na(i)) DF$n2[seq_len(nrow(DF))[-seq_len(i - 1)]] <- DF$n[i]
DF$n2
}
res <- dat # work with a copy
res$n2 <- unlist(lapply(split(dat[c(1:2, 4)], dat$x), FUN = fun))
res
# x y m n n2
#1 1 200P Jan Perm Perm
#2 1 200T Feb Temp Temp
#3 1 300P Jan Perm Temp
#4 2 200T Feb Temp Temp
#5 2 300T Feb Temp Temp
#6 3 300P Jan Perm Perm
#7 3 400P Jan Perm Perm
Если вам не нужен этот новый столбец, просто сделайте
res$n <- res$n2
res <- res[-ncol(res)]
РЕДАКТИРОВАТЬ.
Очевидно, мой исходный код был правильным.Ниже указано, что ОП запрашивает в последнем комментарии.
fun2 <- function(DF){
i <- grep("T", DF$y)[1]
DF$n2 <- if(!is.na(i)) DF$n[i] else DF$n
DF$n2
}
res2 <- dat # work with a copy
res2$n2 <- unlist(lapply(split(dat[c(1:2, 4)], dat$x), FUN = fun))
res2
# x y m n n2
#1 1 200P Jan Perm Temp
#2 1 200T Feb Temp Temp
#3 1 300P Jan Perm Temp
#4 2 200T Feb Temp Temp
#5 2 300T Feb Temp Temp
#6 3 300P Jan Perm Perm
#7 3 400P Jan Perm Perm
ДАННЫЕ.
dat <- read.table(text = "
x y m n
1 200P Jan Perm
1 200T Feb Temp
1 300P Jan Perm
2 200T Feb Temp
2 300T Feb Temp
3 300P Jan Perm
3 400P Jan Perm
", header = TRUE)
РЕДАКТИРОВАТЬ 2.
С условиями в вашем вопросе редактирования, это намного проще, используйте логический индекс.
Обратите внимание, что в вашем редактировании сначала вы говорите, чтобы изменить значение столбца b
с 4 на, если столбец c
равен 0.2
, но затем вы говорите, чтобы изменить его, если столбец c
равен 0.4
.Код ниже использует 0.2
.
inx <- dat2$b == 4 & dat2$c == 0.2
dat2$b[inx] <- 1
ДАННЫЕ 2.
dat2 <- read.table(text = "
a b c d
1 1 0.4 Minor
1 1 0.4 Minor
1 4 0.2 Minor
1 2 2.4 Major
2 4 0.2 Minor
3 1 0.4 Minor
3 4 0.2 Minor
3 4 4.2 Major
", header = TRUE)