【问题标题】:IF-statements containing OR in a dataframe in R在 R 中的数据框中包含 OR 的 IF 语句
【发布时间】:2020-09-01 16:55:08
【问题描述】:

我有一个 DF。如果“name1”列不为空或不包含特定值(例如 christopher),我想粘贴一些信息。如果该列包含空白值或“christopher”,我希望保留这些值。

我尝试过结合 OR 的不同 if-else 语句,但没有一个能引导我达到预期的结果。因为 DF 中的名称可能不同,所以我正在寻找 %like%-solution 或类似的解决方案,而不是完全匹配(空白值除外)

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"))

【问题讨论】:

  • 粘贴可用于将东西粘在一起,例如,paste("a", "b") 给出"a b"。如果你只有一件事,paste('Something to be pasted')'Something to be pasted' 的路还很长。
  • 我知道,只是为了让这个问题看起来不那么无聊????
  • 无需不必要地使您的问题复杂化。它会分散你的逻辑陈述的真正问题。
  • 我想也许你想要&amp;而不是|?让我们谈谈您使用felse(df$name1 =='', '', ifelse(df$name1 %!like% ('christopher') | df$name1 !='' 完成的工作首先,如果名称为空白,则它保持空白,好吧。接下来,如果名称不是 Christopher ,如果它不是空白,则它变为'Something to be pasted'。你为什么在第二个ifelse() 中检查不是空白!= '' - 所有空白都已被第一个捕获。正因为如此,剩下的所有内容都不是空白的,所以无论xxx 是什么,xxx | df$name1 != '' 都将始终为真。

标签: r dataframe if-statement paste


【解决方案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 & 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多