R,用另一个data.frame +动态列

时间:2016-10-04 19:41:20

标签: r

最佳

基本上,我有一个表数据和一个较小的表词汇。 我想要的是,词汇的值很好地映射到数据值。这是一个功能,以这种方式可以使用+/- 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")

4 个答案:

答案 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)

这篇文章似乎与下面列出的文章重复。

VLookup type method in R

你应该能够使用合并函数计算出你想做的事情:

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)
}