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.table
s 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
我有一个带有名称的数据框 我有第二个数据框,其中包含姓名字典和这些姓名的性别 我想检查这个名字是否在字典中,如果是,然后将字典中的性别 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.table
s 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