R数据框列更新

R Data frame column update

我有一个带有名称的数据框 我有第二个数据框,其中包含姓名字典和这些姓名的性别 我想检查这个名字是否在字典中,如果是,然后将字典中的性别 table 添加到名称数据框

我的代码如下所示

# Sets everything to -1, 1 for male, 0 for female
train$sex <- "-1"
train$sex[toupper(train$fname) == nam_dict$Name]<-nam_dict$Sex

我收到以下错误

Error in train$sex[toupper(train$fname) == nam_dict$Name] <- nam_dict$Sex : 
NAs are not allowed in subscripted assignments
In addition: Warning message:
In toupper(train$fname) == nam_dict$Name :
longer object length is not a multiple of shorter object length

我有一个解决方法 - 我想 - 我可以将字典分为男性和女性,只需替换 <-nam_dict$Sex 带有字符 'F' 或 'M' 的代码部分,具体取决于字典

我只是觉得会有更好的方法

所以您的问题可以通过快速简单地实施 match 来解决。 首先,这是一个可快速重现的示例

(train <- data.frame(fname = c("Alex", "Jennifer", "David", "Alice")))
#      fname
# 1     Alex
# 2 Jennifer
# 3    David
# 4    Alice
(nam_dict <- data.frame(Name = c("alice", "alex"), Sex = 0:1))
#    Name Sex
# 1 alice   0
# 2  alex   1

可能的解决方案

train$sex <- nam_dict$Sex[match(tolower(train$fname), tolower(nam_dict$Name))]
train
#      fname sex
# 1     Alex   1
# 2 Jennifer  NA
# 3    David  NA
# 4    Alice   0

更高级的解决方案(如果你曾经处理过庞大的数据集)是尝试 data.tables binary join,它允许你更新你的数据 通过引用,选择要更新的列,同时一切都以闪电般的速度完成。

首先我们将两个数据集都转换为 data.table class 并将两列都设为小写,然后我们将 key 它们按我们想要加入的列进行连接,最后我们这样做通过引用创建 sex 列并从 i 中提取数据(nam_dict 中的性别列)

时左连接到 train
library(data.table)
setDT(train)[, fname := tolower(fname)]
setDT(nam_dict)[, Name := tolower(Name)]
setkey(train, fname) ; setkey(nam_dict, Name)
train[nam_dict, sex := i.Sex]
train
#       fname sex
# 1:     alex   1
# 2:    alice   0
# 3:    david  NA
# 4: jennifer  NA