Dplyr if_else, ссылаться на другой столбец в наборе данных, если false - PullRequest
0 голосов
/ 10 октября 2018

Мне трудно с оператором if_else в R / dplyr.Моя цель - найти в столбце конкретные модели телефонов Nexus и создать новый столбец, в котором будет указано «android phone», если найдены значения nexus, или ссылка на столбец 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 голосов
/ 10 октября 2018

@ Тайлер, я не могу добавить комментарий к правильному ответу, но я думаю, что хороший аргумент можно привести в любом случае.Лично я предпочитаю сохранить старый столбец, всегда приятно проверить, чтобы ваш код работал так, как было запланировано.Однако, если вы используете 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))
0 голосов
/ 13 октября 2018

Это также может быть решено с использованием case_when из dplyr, который, как мне кажется, немного точнее, и также обобщает случаи, когда существует более двух результатов (то есть, если, еще, если, и еще, вместо просто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 можно найти здесь, на сайте dplyr .

0 голосов
/ 10 октября 2018

Я думаю, что ваша проблема в том, что 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...