簡體   English   中英

R,用另一個data.frame +動態列中的值替換data.frame中的值

[英]R, replace values in a data.frame by values from another data.frame + dynamic columns

最好

基本上,我有一個表數據和一個較小的表詞匯表 我想擁有的是, 詞匯表的值可以很好地映射到數據值上。 而且這在函數內,可以動態地+/-使用

鑒於:

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

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來查找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

您是否考慮過合並,然后刪除不需要的列? 像這樣

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

這篇文章似乎與以下所列內容重復。

R中的VLookup類型方法

使用合並功能,您應該能夠設計出一個功能來完成您想做的事情:

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

如果我理解您的目標正確,那么您想將兩個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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM