Dplyr if_else,如果为假,则引用数据集中的另一列

时间:2018-10-10 18:16:45

标签: r dplyr

我在R / dplyr中使用if_else语句时遇到困难。我的目标是在一列中查找特定的Nexus手机型号,并在发现关联值的情况下创建一个新列,将其显示为“ android phone”,或引用同一行中的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) 

3 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这也可以使用dplyr的case_when来解决,我认为它有点整洁,并且可以推广到存在两个以上结果的实例(即if,if,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是您的其他内容,因为该值始终为true,因此,如果到达case_when的最后一行,则将执行该行。 here on the dplyr website可以找到case_when的完整文档。