Dplyr如果为“否则”,请参考数据集中的另一列(如果为false)

Dplyr如果为“否则”,请参考数据集中的另一列(如果为false),r,dplyr,R,Dplyr,我很难用R/dplyr中的if_else语句。我的目标是在一列中查找特定的Nexus手机型号,并创建一个新列,如果找到Nexus值,则显示“android phone”,或者在同一行中引用设备类型列。我不断得到以下代码的错误条件。我怎样才能让它引用另一列?还想知道是否有办法使if条件更简洁。newdevice是我正在创建的专栏。谢谢 #Correct Nexus issue df$newdevice <- if_else(df$wurfl_model_name == "Nexus 5" |

我很难用R/dplyr中的if_else语句。我的目标是在一列中查找特定的Nexus手机型号,并创建一个新列,如果找到Nexus值,则显示“android phone”,或者在同一行中引用设备类型列。我不断得到以下代码的错误条件。我怎样才能让它引用另一列?还想知道是否有办法使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) 
#纠正Nexus问题

df$newdevice我认为您的问题在于
df$device\u type
是类型因素而不是字符,因此将其强制为字符应该可以解决您的问题:

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

@泰勒,我不能对正确的答案添加评论,但我认为无论哪种方式都可以提出一个好的论点。我个人更喜欢保留旧列,检查代码是否也按计划运行总是很好的。但是,如果您使用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))
库(tidyverse)
df%
变异(设备类型=as.字符(设备类型),
newdevice=if\u else(wurfl\u型号\u名称%in%
c(“Nexus 5”、“Nexus 7”、“Nexus 6P”,
“Nexus 6”、“Nexus 5X”、“Nexus”、“Nexus 4”),
“安卓手机”,设备(U型)

这也可以通过使用dplyr中的
case_来解决,我认为这有点简洁,并且还可以推广到有两个以上结果的实例(即if、else if和else,而不是if和else)

库(tidyverse)
df%
变异(
设备类型=作为字符(设备类型),
新设备=情况(
wurfl_型号名称%c(“Nexus 5”、“Nexus 7”、“Nexus 6P”、“Nexus 6”、“Nexus 5X”、“Nexus”、“Nexus 4”)~“android手机”,
真~设备类型
)
)

情况下_when
,每一行基本上都是一条if语句。如果满足第一行的条件,则执行该操作。否则,如果满足第二行的条件,则执行该操作。最后一行中的
TRUE
是您的else,因为它的计算结果总是TRUE,因此,如果到达
案例的最后一行,则将执行该行。可以找到
案例的完整文档。

您遇到了什么错误?为了使其简洁,您可以执行
grep
来查找
Nexus
。类似于
grepl(“Nexus”,df$model\u name)
。警告消息:未知或未初始化列:“设备类型”。re:grep,问题是有些nexus设备是平板电脑,所以我需要指定要更正的特定设备(因为另一列中的错误导致手机标签错误)。设备类型是否指定了这些设备?您可以执行
grep
df$device\u type!=“tablet”
位于
ifelse
中。或者像下面建议的那样在%
中使用
%。如果看不到您的数据,很难判断。你能发个帖子吗?你们太棒了。这就解决了问题。最后一个问题是:最佳实践。我通常会发现自己需要修改列中的数据,但当我在R中执行操作时,我通常会创建一个新列并删除旧列。对于上述内容,这是正确的方法,还是我可以轻松地修改原始设备列
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))
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
    )
  )