0

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

我的代码如下所示

# 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”

我只是认为会有更好的方法

4

1 回答 1

1

因此,您的问题可以通过快速简单的实现来解决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.table更高级的解决方案(如果您曾经使用过庞大的数据集)是尝试使用二进制连接,它允许您通过引用更新数据,选择要更新的列,同时一切都以闪电般的速度完成。

首先,我们将两个数据集转换为data.table类并将两列都设为小写,然后我们将key它们按我们想要连接的列,最后我们在通过引用train创建sex列并从中提取数据时进行左连接i(Sex 列nam_dict)

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
于 2015-05-02T20:42:29.050 回答