Есть ли какая-либо функция или сценарии R для обмена значением выбора в следующих данных набора выбора? - PullRequest
1 голос
/ 17 апреля 2020

набор данных: mode = c (такси, такси, такси, такси), выбор = c (1, 0, 0, 0), основной режим = c (BS, автомобиль, активный, TX)

Здесь наблюдается реальная поездка на такси из колонки с названием «режим». Затем мне нужно изменить значение в столбце «chioce» 0 в строке 1 и 1 в строке 4 на основе информации столбца «основной режим», где BS = BUS, car = car, active = walk, TX = taxi.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

mode и mainmode не имеют одинаковых терминов, поэтому их невозможно сравнить. Измените либо mode, либо mainmode, и тогда будет легко сравнить их напрямую.

library(dplyr)

df %>%
   mutate(mainmode = recode(mainmode, 'BS' = 'BUS', 'car' = 'car', 
                            'active' = 'walk', 'TX' = 'taxi'), 
          choice = as.integer(mode == mainmode))


#  mode choice mainmode
#1 taxi      0      BUS
#2 taxi      0      car
#3 taxi      0     walk
#4 taxi      1     taxi

данные

df <- data.frame(mode=c("taxi", "taxi", "taxi", "taxi"), choice = c(1, 0, 0, 0),
           mainmode = c("BS", "car", "active", "TX"), stringsAsFactors = FALSE)
0 голосов
/ 17 апреля 2020

Мы можем использовать data.table методы

library(data.table)
setDT(df)[, mainmode := recode(mainmode, 'BS' = 'BUS', 
                  'car' = 'car', 
                           'active' = 'walk', 'TX' = 'taxi')][, choice := +(mode == mainmode)]
df
#   mode choice mainmode
#1: taxi      0      BUS
#2: taxi      0      car
#3: taxi      0     walk
#4: taxi      1     taxi

или base R, это можно сделать с именованным вектором

df$mainmode <- setNames(c('BUS', 'car', 'walk', 'taxi'), 
           c('BS', 'car', 'active', 'TX'))[as.character(df$mainmode)]
df$choice <- +(df$mode == df$mainmode)
data
df <- data.frame(mode=c("taxi", "taxi", "taxi", "taxi"), choice = c(1, 0, 0, 0),
       mainmode = c("BS", "car", "active", "TX"), stringsAsFactors = FALSE)
0 голосов
/ 17 апреля 2020

Предполагая, что ваши данные находятся во фрейме данных df, вам нужно создать таблицу соответствия, а затем найти значения для преобразования из основного режима в режим. Затем сопоставьте в режиме.

modelookup=data.frame(mode=c("bus","car","walk","taxi"),main=c("BS","car","active","TX"))
df$lookup = modelookup$mode[match(df$mainmode, modelookup$main)]
df$choice = as.numeric(df$mode==df$lookup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...