Операторы IF, содержащие ИЛИ в фрейме данных в R

#r #dataframe #if-statement #paste

#r #фрейм данных #оператор if #вставить

Вопрос:

У меня есть DF. Если столбец ‘name1’ не является пустым или не содержит определенного значения (например, christopher), я хотел бы вставить некоторую информацию. Если столбец содержит пустое значение или ‘christopher’, я бы хотел, чтобы эти значения сохранялись.

Я пробовал использовать разные предложения if-else в сочетании с OR, но ни одно из них не привело меня к желаемому результату. Поскольку имена в DF могут отличаться, я ищу %подобное%-решение или подобное, а не точное совпадение (за исключением пустых значений)

 df <- data.frame("name1" = c("august", "", "christopher", "david", "erica", ""), "name2" = c("berit", "august", "david", "erica", "frank", "christopher"), stringsAsFactors = F)

#IF-ELSE sentence with '%!like%'
'%!like%' <- function(x,y)!('%like%'(x,y))
df$name1 <- ifelse(df$name1 !=''  |  df$name1 %!like% ('christopher') ,paste('Something to be pasted'), df$name1)

#Nested IF-ELSE sentence with '%!like%'
df$name1 <- ifelse(df$name1 =='', '', 
       ifelse(df$name1 %!like% ('christopher') | df$name1 !='' , paste('Something to be pasted'),
       ifelse(df$name1 %!like% ('christopher'),df$name1))

  

Мой ожидаемый результат

 df_exp <- data.frame("name1" = c("Something to be pasted", "", "christopher", "Something to be pasted", "Something to be pasted", ""), "name2" = c("berit", "august", "david", "erica", "frank", "christopher"))

  

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

1. Вставка полезна для склеивания объектов, например, paste("a", "b") дает "a b" . Если у вас есть только одна вещь, paste('Something to be pasted') это долгий путь для записи 'Something to be pasted' .

2. Я знаю, это было просто для того, чтобы вопрос выглядел менее скучным 😉

3. Нет необходимости излишне усложнять ваш вопрос. Это отвлекает от реальной проблемы, которая является вашими логическими утверждениями.

4. Я думаю, может быть, вы amp; не | хотите? Давайте обсудим, чего вы добиваетесь felse(df$name1 =='', '', ifelse(df$name1 %!like% ('christopher') | df$name1 !='' Сначала, если имя пустое, оно остается пустым, хорошо. Далее, если имя не похоже на Christopher или если оно не пустое, тогда оно становится 'Something to be pasted' . Почему вы проверяете not blank != '' во втором ifelse() — все пробелы уже были захвачены первым. И из-за этого все, что осталось, не является пустым, поэтому xxx | df$name1 != '' всегда будет true, что бы xxx ни было.

Ответ №1:

Я бы предложил внести небольшие изменения в ваш код. Использование grepl() создает логические значения, которые могут быть лучше поняты в других функциях:

 #Data
df <- data.frame("name1" = c("august", "", "christopher", "david", "erica", ""), "name2" = c("berit", "august", "david", "erica", "frank", "christopher"), stringsAsFactors = F)

#IF-ELSE
df$name1 <- ifelse(df$name1 =='', '', 
                   ifelse(grepl('christopher',df$name1)==F amp; df$name1 !='' , paste('Something to be pasted'),
                          df$name1))
  

Вывод:

                    name1       name2
1 Something to be pasted       berit
2                             august
3            christopher       david
4 Something to be pasted       erica
5 Something to be pasted       frank
6                        christopher