我在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)
答案 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
的完整文档。