最佳
基本上,我有一个表数据和一个较小的表词汇。 我想要的是,词汇的值很好地映射到数据值。这是一个功能,以这种方式可以使用+/- dynamicaly
假设:
dt : data.csv
V1____V2___sex__V4__V5_
abc abc jeny abc 123
abc abc eric abc 123
abc abc bob abc 123
vocabulary1: sex.csv
old___new
jeny f
eric m
bob m
通缉结果:
V1____V2___sex__V4__V5_
abc abc f abc 123
abc abc m abc 123
abc abc m abc 123
我的
replace_by_vocabulary <- function(dt,voc,col_name){
dt[,col_name] <- tolower(dt[,col_name])
**** something something ***
return(dt)
}
我想如何使用它......
dt <- replace_by_vocabulary(dt,vocabulary1,"sex")
dt <- replace_by_vocabulary(dt,vocabulary2,"date")
dt <- replace_by_vocabulary(dt,vocabulary3,"mood")
答案 0 :(得分:2)
merge
的替代方案更符合您的要求:
replace_by_vocabulary <- function(dt,voc,col_name){
col <- which(colnames(dt) == col_name)
dt[,col] <- voc$new[match(tolower(dt[,col]), voc$old)]
return(dt)
}
您希望首先从dt
字符串输入中找到col_name
中的列。然后,使用match
查找与voc$old
匹配的tolower(dt[,col])
行索引,并使用这些索引从voc$new
中检索替换值。在这里,我们将dt[,col]
列转换为所有小写,就像您在示例代码中一样,在函数中动态地将其转换为匹配词汇表中的小写数据。优于merge
的优点是我们之后不必重命名和删除列以获得所需的结果。
使用您的数据:
replace_by_vocabulary(dt,vocabulary,"sex")
## V1 V2 sex V4 V5
##1 abc abc f abc 123
##2 abc abc m abc 123
##3 abc abc m abc 123
答案 1 :(得分:1)
您是否考虑过合并,然后删除不需要的列?像这样。
dt<-merge(x=dt, y=vocabulary1, by.x="sex", by.y="old")
dt<-dt %>%
select(-sex) %>%
mutate(sex=old)
答案 2 :(得分:1)
这篇文章似乎与下面列出的文章重复。
你应该能够使用合并函数计算出你想做的事情:
string = c("abc", "abc", "abc")
names = c("jeny", "eric", "bob")
sex = c("f", "m", "m")
data = data.frame(cbind(string, string, names, string, c(1, 2, 3)))
vocabulary1 = data.frame(cbind(names, sex))
dt = merge(data, vocabulary1, by.x = "names")
dt
答案 3 :(得分:1)
如果我理解你的目标是正确的,你想要将两个data.frames合并在一起吗?
你应该看看?merge
例如:
merge(x = dt, y = vocabulary1, by.x = "sex", by.y = "old")
如果你想要一个动态功能,你可以做
replace_by_vocabulary <- function(dt,voc,col_name){
merged_df <- merge(x = dt, y = voc, by.x = "sex", by.y = col_name)
return(merged_df)
}