Ошибка неиспользуемого аргумента в инструкции ifelse с использованием R

#r #if-statement #subset #rbind

#r #if-statement #подмножество #rbind

Вопрос:

Я пытаюсь создать новый фрейм данных на основе инструкции ifelse. Я проверяю 1 фрейм данных, чтобы увидеть, содержит ли поле строку. Если это произойдет, я затем хочу добавить строки из этого фрейма данных в другой фрейм данных, используя методы filter, subset и rbind:

Это работает:

   #Check to see if field contains string. 
  timeline.data.2 <-ifelse(grepl(1043-1, prescription.data$case_id), 
                                timeline.data <- timeline.data %>%
                                  filter(case_id==1043-1),          

                                "do nothing")
 

Это не:

   #Check to see if field contains string. 
  timeline.data.2 <-ifelse(grepl(1043-1, prescription.data$case_id), 
                                timeline.data <- timeline.data %>%
                                  filter(case_id==1043-1),
                                timeline.data <-subset(timeline.data, select = c(event,group,start,end,color,tooltip)),
                                timeline.data <- subset(prescription.data, select = c(event,group,start,end,color,tooltip)),
                                timeline.data <- rbind(timeline.data, prescription.data),
                                "do nothing")
 

Я получаю ошибку:

 Error in ifelse(grepl(1043 - 1, prescription.data$case_id), timeline.data <- timeline.data %>%  : 
unused argument ("do nothing")
 

Что я здесь делаю не так?

Комментарии:

1. Назначение (` временная шкала. данные <- ) would not work inside ifelse`

2. я пробовал это без, и все равно не повезло. т.е. подмножество (временная шкала.данные, выбор = c(событие, группа, начало, конец, цвет, всплывающая подсказка))

3. Кроме того, ваше «да» — это data.fframe вместо vector

4. если условие выполнено, я просто хочу запустить подмножество / фильтр / cbind и т. Д. мысли?

5. Вы проверяете наличие any элементов?

Ответ №1:

ifelse принимает ровно три аргумента. Вы, кажется, предоставляете … 6? Я думаю? Вот что означает «неиспользуемый аргумент»: вы дали ему слишком много аргументов. Вот почему ваш первый пример работает, только три аргумента.

Используется ifelse для выбора между значениями при запуске вектора. Это хорошо для простых заданий, таких как замена NAs : ifelse(is.na(my_data), 'bad value', my_data) .

После того, как вы уточните, для чего вы используете ifelse , сделайте отступ и разбейте код на строки должным образом. Тогда вы сможете интерпретировать, что является аргументом, а что нет, и сообщения об ошибках, подобные этому, будут иметь гораздо больше смысла.

Если я прогоняю ваш код через styler него, он выводит его следующим образом:

 # Check to see if field contains string.
timeline.data.2 <- ifelse(grepl(1043 - 1, prescription.data$case_id),
  timeline.data <- timeline.data %>%
    filter(case_id == 1043 - 1),
  timeline.data <- subset(timeline.data, select = c(event, group, start, end, color, tooltip)),
  timeline.data <- subset(prescription.data, select = c(event, group, start, end, color, tooltip)),
  timeline.data <- rbind(timeline.data, prescription.data),
  "do nothing"
)
 

Теперь ГОРАЗДО ПРОЩЕ увидеть все эти строки, заканчивающиеся запятыми, переходящие в ifelse .

Ответ №2:

Возможно, лучше использовать if/else

 library(dplyr)
if(any(grepl("1043-1", prescription.data$case_id))) {

    timeline.data <- timeline.data %>%
                        filter(grepl("1043-1", case_id))

 } else "do nothing"

    
 

Комментарии:

1. Спасибо. Что здесь означает «любой»?

2. @DiamondJoe12 я использовал any , потому if/else что ожидает одно значение TRUE / FALSE в качестве входных данных. Итак, если есть какие-либо значения ‘1043-1’, требуется отфильтровать строки