【问题标题】:R, replace values in a data.frame by values from another data.frame + dynamic columnsR,用另一个data.frame +动态列中的值替换data.frame中的值
【发布时间】:2016-10-04 19:41:19
【问题描述】:

最好的

基本上,我有一个表 data 和一个较小的表 vocabulary。 我想要的是,vocabularies 的值很好地映射到 data 值上。这在一个函数中,以这样一种方式可以动态地使用 +/-

鉴于:

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

【问题讨论】:

标签: r


【解决方案1】:

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

您想首先从col_name 字符串输入中找到dt 中的列。然后,使用match 查找与tolower(dt[,col]) 匹配的voc$old 的行索引,并使用这些从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

【讨论】:

    【解决方案2】:

    此帖子似乎与下面列出的帖子重复。

    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】:

      如果我理解您的目标正确,您想将两个 data.frame 合并在一起吗? 你应该看看?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)
      }
      

      【讨论】:

      • 不,目的是替换一列中的值,如果它们匹配词汇表的“旧”列。但你不能做类似 dt$["sex"] == voc$old
      • 那么我认为@aichao 为您提供了一个您可以接受的不错的解决方案。
      【解决方案4】:

      您是否考虑过合并,然后删除不需要的列?像这样。

      dt<-merge(x=dt, y=vocabulary1, by.x="sex", by.y="old")
      dt<-dt %>% 
         select(-sex) %>% 
         mutate(sex=old)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        相关资源
        最近更新 更多