#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