【问题标题】:Dplyr if_else, refer to another column in dataset if falsedplyr if_else,如果为假,则引用数据集中的另一列
【发布时间】:2018-10-10 18:16:44
【问题描述】:

我很难在 R/dplyr 中使用 if_else 语句。我的目标是查看特定 Nexus 手机型号的列,并创建一个新列,如果找到关联值,则显示“android 手机”,或者引用同一行中的 device_type 列。我不断收到以下代码的错误条件错误。我怎样才能让它引用另一列?还想知道是否有办法使 if 条件更简洁。 newdevice 是我正在创建的列。谢谢!

#Correct Nexus issue
df$newdevice <- if_else(df$wurfl_model_name == "Nexus 5" | df$wurfl_model_name == "Nexus 7" | df$wurfl_model_name == "Nexus 6P" | df$wurfl_model_name == "Nexus 6" | df$wurfl_model_name == "Nexus 5X" | df$wurfl_model_name == "Nexus" | df$wurfl_model_name == "Nexus 4", "android phone", df$device_type) 

【问题讨论】:

  • 您遇到的错误是什么?为了简洁起见,您可以使用grep 来查找Nexus。类似grepl("Nexus", df$model_name)
  • 警告消息:未知或未初始化的列:'device_type'。回复:grep,问题是有一些 nexus 设备是平板电脑,所以我需要指定要更正的具体设备(因为另一列中的错误导致手机被贴错标签)
  • 设备类型是否指定?您可以在ifelse 中执行grepdf$device_type != "tablet"。或者像下面建议的那样使用%in%。没有看到您的数据,很难判断。可以发minimal reproducible example吗?

标签: r dplyr


【解决方案1】:

我认为您的问题是 df$device_type 是类型因素而不是字符,因此将其强制为字符应该可以解决您的问题:

df$device_type <- as.character(df$device_type)

此外,您可以使用%in% 运算符使您的代码更简单:

df$newdevice <- if_else(
  df$wurfl_model_name %in%
    c(
      "Nexus 5",
      "Nexus 7",
      "Nexus 6P",
      "Nexus 6",
      "Nexus 5X",
      "Nexus",
      "Nexus 4"
    ),
  "android phone",
  df$device_type
)

【讨论】:

  • 你们太棒了。解决了这个问题。最后一个问题是:最佳实践。我通常发现自己需要修改列中的数据,但是当我在 R 中执行操作时,我通常会创建一个新列并删除旧列。对于上述情况,这是正确的方法,还是我可以轻松修改原始设备列
【解决方案2】:

@Tyler,我无法对正确答案添加评论,但我认为无论哪种方式都可以提出很好的论据。我个人更喜欢保留旧专栏,检查以确保您的代码也按计划运行总是很好。但是,如果您使用 dplyr,我建议您使用 mutate 创建新变量。这会将 DiceBoyT 的答案更改为:

library(tidyverse)

df <- df %>%
      mutate(device_type = as.character(device_type),
             newdevice = if_else(wurfl_model_name %in% 
                                   c("Nexus 5", "Nexus 7", "Nexus 6P",
                                     "Nexus 6", "Nexus 5X", "Nexus", "Nexus 4"),
                                 "android phone", device_type))

【讨论】:

    【解决方案3】:

    这也可以使用来自 dplyr 的case_when 来解决,我认为这更简洁一些,并且还可以推广到有两个以上结果的情况(即 if、else if 和 else,而不仅仅是if 和 else)。

    library(tidyverse)
    
    
    df <- df %>%
      mutate(
        device_type = as.character(device_type),
        new_device = case_when(
          wurfl_model_name %in% c("Nexus 5", "Nexus 7", "Nexus 6P", "Nexus 6", "Nexus 5X", "Nexus", "Nexus 4") ~ "android phone",
          TRUE ~ device_type
        )
      )
    

    case_when中,每一行基本上都是一个if语句。如果满足第一行的条件,则执行此操作。否则,如果满足第二行的条件,则执行此操作。最后一行中的TRUE 是您的else,因为它的计算结果始终为true,因此如果到达case_when 的最后一行,该行将被执行。 case_when 的完整文档可以在 here on the dplyr website 找到。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2019-10-20
      • 1970-01-01
      • 2018-02-06
      • 2020-06-20
      • 2020-05-21
      • 1970-01-01
      • 2022-01-19
      • 2017-11-13
      相关资源
      最近更新 更多