Как вы изменяете новый столбец на основе существующего столбца символов, когда вам нужно более 2 результатов?

#r

Вопрос:

Итак, в основном, из такой таблицы, как эта, со столбцом, содержащим шесть различных типов символов».:

 Subject  Name 
         <chr> 
   1      a
   2      b
   3      c
   4      d
   5      e
   6      f
   7      b 
  etc.   etc. 

*7 out of 1000 rows*
 

Я хочу создать новый столбец, используя функцию mutate/similair, чтобы создать новый столбец символов на основе этих шести групп в «Имени», чтобы новая таблица выглядела так:

 Subject  Name    New column
         <chr>      <chr>
   1      a          Hi
   2      b          Hello
   3      c          Sup
   4      d          Yo
   5      e          Hullo
   6      f          Yosha
   7      b          Hello
  etc.   etc.        etc. 
*7 out of 1000 rows*
 

Я пробовал использовать функцию if следующим образом:

 mutate("New column" = if(Name %in% "a") {
"Hi"
}  
else if(Name %in% "b"){
"Hello"
}  
else if(Name %in% "c") {
"Sup"
}     
else if(Name %in% "d") {
"Yo"
}    
else if(Name %in% "e") {
"Hullo"
}  
else if(name %in% "f") {
"Yosha"
})  
 

Но я не могу заставить его работать. Некоторая помощь была бы действительно признательна.

Комментарии:

1. Лучше всего предоставить воспроизводимый пример вашего фрейма данных. Но я думаю, что вы должны смотреть на left_join функцию, а mutate не . Создайте фрейм данных «словарь», в котором в одном столбце будут содержаться ваши группы (a, b, c и т.д.), А в другом — соответствующее имя (привет, привет, sub и т.д.). Затем left_join ваш набор данных с этим новым, который вы создали

2. Хорошо, я попробую, но я приму во внимание эту «воспроизводимую вещь». Однако эта таблица является составленной концептуальной таблицей, на самом деле ни на чем не основанной, поэтому я не включил код фрейма данных, Спасибо за ваше время

Ответ №1:

Я думаю, что самый простой способ сделать это, если у вас есть только небольшое количество замен, — это:

 lookup <- c(a = "Hi", b = "Hello", c = "Sup", d = "Yo", e = "Hullo", f = "Yosha")

df %>% mutate(New_Column = lookup[Name])

#>   Subject Name New_Column
#> 1       1    a         Hi
#> 2       2    b      Hello
#> 3       3    c        Sup
#> 4       4    d         Yo
#> 5       5    e      Hullo
#> 6       6    f      Yosha
#> 7       7    b      Hello
 

Данные (взяты из вопроса)

 df <- structure(list(Subject = 1:7, Name = c("a", "b", "c", "d", "e", 
                     "f", "b")), class = "data.frame", row.names = c(NA, -7L))

df
#>   Subject Name
#> 1       1    a
#> 2       2    b
#> 3       3    c
#> 4       4    d
#> 5       5    e
#> 6       6    f
#> 7       7    b
 

Ответ №2:

Вы можете попробовать case_when() с dplyr . Последняя строка, начинающаяся с TRUE , предназначена для присвоения отсутствующего значения new_col if name , не являющегося a-f.

 library(tidyverse)

dat <- data.frame(
  subject = 1:6,
  name = letters[1:6]
)


dat |> 
  mutate(new_col = case_when(
    name == "a" ~ "Hi",
    name == "b" ~ "Hello",
    name == "c" ~ "Sup",
    name == "d" ~ "Yo",
    name == "e" ~ "Hullo",
    name == "f" ~ "Yosha",
    TRUE ~ NA_character_
  ))

#   subject name new_col
#        1    a      Hi
#        2    b   Hello
#        3    c     Sup
#        4    d      Yo
#        5    e   Hullo
#        6    f   Yosha