После того, как определенное значение встречается N раз, замените все оставшиеся вхождения на другое значение - PullRequest
0 голосов
/ 06 февраля 2019

Вот мой набор данных:

VarID    x1      x2      x3     x4     x5
1        Red     Yellow  Green  Green  Green 
2        Yellow  Green   Green  Green  Green 
3        Red     Red     Red    Yellow Green 

Я хочу написать цикл for, который проходит через каждую строку и после определенного значения, в этом случае слово «Green» появляется n разЯ хочу заменить все оставшиеся «зеленые» значения на что-то еще.Я хочу заменить все оставшиеся значения «Green» словом «Go» после того, как слово «Green» появилось 2 раза.Вывод должен выглядеть следующим образом:

VarID    x1      x2      x3     x4     x5
1        Red     Yellow  Green  Green  Go
2        Yellow  Green   Green  Go     Go
3        Red     Red     Red    Yellow Green 

Я полагаю, цикл for справится, если функция не будет более эффективной?Это то, что я пытался, но я знаю, что есть проблема с синтаксисом, поэтому я не уверен, как его кодировать.

for(x in data){
   if(sum(which(data=="Green"))>2){
       data[x=="Green, ] <- "Go"
}}

1 Ответ

0 голосов
/ 06 февраля 2019

Используя ввод, показанный воспроизводимо в конце заметки, попробуйте это:

addGo <- function(x) replace(x, cumsum(x == "Green") > 2 & x == "Green", "Go")
replace(DF, -1, replace(DF[-1], TRUE, t(apply(DF[-1], 1, addGo))))

, что дает:

  VarID     x1     x2    x3     x4    x5
1     1    Red Yellow Green  Green    Go
2     2 Yellow  Green Green     Go    Go
3     3    Red    Red   Red Yellow Green

или напишите его так:

isGreen <- DF[-1] == "Green"
replace(DF, -1, replace(DF[-1], t(apply(isGreen, 1, cumsum)) > 2 & isGreen, "Go"))

Примечание

Предполагается, что ввод:

Lines <- "
VarID    x1      x2      x3     x4     x5
1        Red     Yellow  Green  Green  Green 
2        Yellow  Green   Green  Green  Green 
3        Red     Red     Red    Yellow Green"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...