У меня есть огромный список, ниже приведен пример trboot6
R Применить функцию с тем, если заявления на каждые элементы в списке
UPDATE: Я не хочу, чтобы удалить лишние «1» или «-1». Вместо этого я хочу изменить его на ноль. Мне так жаль
dput()
structure(list(`1` = c(-1, 1, -1, -1, -1, -1, -1, -1, -1, 1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `2` = c(-1,
-1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1,
-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `3` = c(1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `4` = c(-1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 1), .Names = c("1", "2", "3", "4"))
Ввод ниже для иллюстрации только
$ 1 : num [1:39] -1 1 -1 -1 -1 -1 -1 -1 -1 1 ...
$ 2 : num [1:46] -1 -1 -1 1 1 1 -1 -1 -1 -1 ...
$ 3 : num [1:48] 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
$ 4 : num [1:43] -1 -1 1 -1 -1 -1 -1 -1 -1 -1 ...
То, что я хочу сделать, это проверить, если в каждом списке каждая пара имеет 1 и -1. Пары представлены в скобках в следующем:
$ 1 : num [1:39] (-1 1) (-1 -1) (-1 -1) (-1 -1) (-1 1) ...
$ 2 : num [1:46] (-1 -1) (-1 1) (1 1) (-1 -1) (-1 -1) ...
$ 3 : num [1:48] (1 -1) (-1 -1) (-1 -1) (-1 -1) (-1 -1) ...
$ 4 : num [1:43] (-1 -1) (1 -1) (-1 -1) (-1 -1) (-1 -1) ...
Если пара не 1 и -1, то, я хочу изменить второе такое же число к нулю, то есть, если пара (1 1)
, я изменю второй 1 до нуля, чтобы получить '(1 0)'. Если снова 1, я тоже изменил это значение 1. Тогда, если есть -1, он будет паре с первым 1.
Для лучшего кода я использовал логику, что сумма должна всегда оставаться между -2 и 2 для существования пар. Пара не может быть (1, -1) (-1,1) или (1, -1) (1, -1). Поэтому, если баланс равен < -2 или> 2, последний номер необходимо удалить.
Вот мой код выше логики:
balboot<-0
fboot<- function(x) {
ifelse(x==-1,balboot<-balbbot-1,balboot<-balboot+1)
if(balboot==-2){x<-0
balboot=-1}
if(balboot==2){x<-0
balboot=1}
return(fboot)
}
rdtp<-lapply(trboot6, FUN=fboot)
После запуска этого я получаю предупреждение:
In if (x == 1) { ... :
the condition has length > 1 and only the first element will be used
Ожидаемый результат:
list '1': -1, 1, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
list '2': -1, 0, 0, 1, 1, 0, -1, -1,0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0
поблагодарить Вас за помогите заранее.
Пожалуйста, разместите воспроизводимый пример usign 'dput'.Кроме того, вместо 'if/else' использовать' ifelse', как он векторизован – akrun
привет! @akrun Я отправил dput в начале вопроса. – miababy
Не могли бы вы разместить ожидаемый вывод для первой записи в списке? – bouncyball