#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