Добавить новый столбец на основе строкового значения из существующего столбца в Rstudio - PullRequest
2 голосов
/ 09 октября 2019

У меня есть набор данных в R, содержащий несколько столбцов. Один столбец room_type содержит либо строковые значения Entire home/apt или Shared room, либо Private room, либо он пустой. Я хочу создать новый столбец room_type_new, где строковые значения основаны на столбце room_type. Примечание. В наборе данных содержится более 100 000 строк.

См. Ниже:

room_type          room_type_new
Entire home/apt    Entire home
Private room       Shared home
Shared room        Shared home
NA                 NULL

Я пробовал этот код, который выводит правильный вывод, но не передает новые значения вroom_type_new:

data1$room_type <- as.character(data1$room_type)
data1$room_type_new <- NA
data1$room_type_new <- as.character(data1$room_type_new)

    data1%>%
      mutate(room_type_new = case_when(.$room_type %in% c("Entire home/apt") ~ "Entire home",.$room_type %in% c("Private room", "Shared room") ~ "Shared home")

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вот вариант с case_when

library(dplyr)
library(stringr)
df1 %>%
   mutate(room_type_new = case_when(str_detect(room_type, "Entire") ~ 
     'Entire home', is.na(room_type) ~ NA_character_, TRUE ~ "Shared home"))
0 голосов
/ 13 октября 2019

Build df:

df <- data.frame(room_type = as.character(c("Entire home/apt", "Private room", "Shared room")), stringsAsFactors = F)

Base R один вкладыш, принимая только два уникальных значения для df $ room_type_new:

df$room_type_new <- ifelse(grepl("Entire home/apt", df$room_type), "Entire home", "Shared home")

Base R один вкладыш, если> 2 уникальных значения для df $room_type_new, вложите ifelse:

df$room_type_new <- ifelse(grepl("Entire home/apt", df$room_type), "Entire home", ifelse(grepl("Private room|Shared room", df$room_type), "Shared home", "")

Также причина, по которой ваши выходные данные передаются чему-либо, заключается в том, что вы не присваиваете результат объекту - используя свой код:

data1 <- 
 data1%>%
  mutate(room_type_new = case_when(.$room_type %in% c("Entire home/apt") ~ "Entire home",.$room_type %in% c("Private room", "Shared room") ~ "Shared home")
...