Создать новый символьный столбец во фрейме данных R на основе существующего символьного вектора - PullRequest
1 голос
/ 20 сентября 2019

Я новичок в R и застрял на том, что кажется простой задачей - создать новый вектор столбца в фрейме данных R с учетом существующего вектора символов.

Например, у меня есть фрейм данных "класс" с одним символьным столбцом ("Имена") и одним числовым столбцом ("Student_numbers"):

Names <- c("Sarah", "Mary", "Ben", "Will", "Alex") 
Student_numbers <- c(3,5,6,7,7)
class <- data.frame(Names, Student_numbers) 

Кфрейм данных «класс», я хотел бы добавить новый символьный столбец под названием «Пол», который основан на значениях в символьном векторе «Имена»:

Male <- c("Ben", "Will", "Alex") 
Female <- c("Sarah", "Mary") 

 Names    Student_numbers  Gender
1 Sarah   3                Female
2 Mary    5                Female
3 Ben     6                Male
4 Will    7                Male
5 Alex    7                Male

Вместо того, чтобы делать это вручную, я бынравится делать это автоматически на основе векторов символов, определенных выше.

Заранее благодарю за помощь.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Это решение работает с использованием библиотеки Tidyverse:

library(tidyverse)
Names <- c("Sarah", "Mary", "Ben", "Will", "Alex") 
Student_numbers <- c(3,5,6,7,7)
class <- data.frame(Names, Student_numbers)
class
class <- class %>% mutate(gender = ifelse(Names %in% c("Sarah","Mary"),"Female","Male"))
class

И результат:

  Names    Student_numbers   gender
1 Sarah               3      Female
2  Mary               5      Female
3   Ben               6      Male
4  Will               7      Male
5  Alex               7      Male

Надеюсь, это поможет.

Дополнение: Подумайте о ваших дополнительныхНапример, давайте получим это:

df <- data.frame(dogs = c("Chucho","Pulgas","Pirata","Carcas","Fido","Bigotes"), 
         number_id = c("10","12","15","16","30","19"), stringsAsFactors = FALSE)

df <- df %>% mutate(dog_type = ifelse(dogs %in% c("Chucho","Pulgas"),"Chihuahua",
                           ifelse(dogs %in% c("Pirata","Carcas"),"Hairless Chimu","San Bernardo"))) %>% mutate(dog_size = ifelse(dog_type %in% c("Chihuahua","Hairless Chimu"),"Small","Big"))

   dogs      number_id   dog_type          dog_size
1  Chucho        10      Chihuahua         Small
2  Pulgas        12      Chihuahua         Small
3  Pirata        15      Hairless Chimu    Small
4  Carcas        16      Hairless Chimu    Small
5  Fido          30      San Bernardo      Big
6  Bigotes       19      San Bernardo      Big

Надеюсь, я ответил на ваш дополнительный вопрос.

С уважением,

Алексис

0 голосов
/ 20 сентября 2019

Вы также можете использовать sapply и более привычные if

class$gender <- sapply(class$Names, function(x) if(x %in% Male) "Male" else "Female" )

 class
 Names Student_numbers gender
1 Sarah               3 Female
2  Mary               5 Female
3   Ben               6   Male
4  Will               7   Male
5  Alex               7   Male

Я бы также предложил добавить stringAsFactors=FALSE при создании class, чтобы избежать необходимости иметь дело с factors.

0 голосов
/ 20 сентября 2019

Вы можете использовать ifelse здесь:

class$Gender <- ifelse(class$Names %in% Male, 
                       "Male", 
                       ifelse(class$Names %in% Female, "Female", NA))
class
#   Names Student_numbers Gender
# 1 Sarah               3 Female
# 2  Mary               5 Female
# 3   Ben               6   Male
# 4  Will               7   Male
# 5  Alex               7   Male

Если у вас будет больше дел, вы также можете использовать case_when из dplyr:

library(dplyr)
case_when(class$Student_numbers < 4 ~ "Grp1",
          class$Student_numbers < 6 ~ "Grp2",
          class$Student_numbers < 7 ~ "Grp3",
          TRUE                      ~ "Other")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...