在R数据框中创建基于现有字符向量的新字符列

3

我是个R语言新手,遇到一件看似简单的任务却卡住了——在现有字符向量的条件下,在R数据框中创建新的列向量。

例如,我有一个名为“class”的数据框,其中包含一个字符列(“Names”)和一个数字列(“Student_numbers”):

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

我想向数据框“class”中添加一个名为“Gender”的新字符列,该列基于字符向量“Names”的值:

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个回答

3
你可以在这里使用 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

如果你有更多的情况需要处理,你也可以使用dplyr中的case_when函数:

library(dplyr)
case_when(class$Student_numbers < 4 ~ "Grp1",
          class$Student_numbers < 6 ~ "Grp2",
          class$Student_numbers < 7 ~ "Grp3",
          TRUE                      ~ "Other")

2
您可以使用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

我建议在创建class时添加stringAsFactors=FALSE,以避免处理factors

2
这个解决方案使用了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

希望我已经回答了您的额外问题。
敬礼,
亚历克西斯

1
谢谢Alexis。为了扩展我的问题,如果我想创建一个新的字符向量,而这个向量有多个类别,该怎么办呢?例如,数据框中现有的字符列是狗的类型(有20多个唯一值),我想要一个新的字符列将它们分类为大型、中型、小型或非常小型。我需要使用“else if”函数吗?提前感谢您。 - Isobel M
你好,@Jane Isobel。在你的例子中,你可以使用嵌套的ifelse来评估每种狗的类型。理想情况下,你应该将狗的类型和大小作为字典存储在一个单独的数据框中,这样你就可以根据任何其他数据进行过滤,比如一个名字和类型的列表。我会在上面的代码中添加示例。 - Alexis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接