【问题标题】:R Replacing colnames based on matching names in another dataframeR根据另一个数据框中的匹配名称替换colnames
【发布时间】:2020-02-06 18:17:38
【问题描述】:

我想根据另一个数据框重命名数据框中的某些列。我有 2 个数据框,一个带有代码作为列名,另一个带有代码列表和字符串。

df = as.data.frame(matrix(NA, 3, 60)) colnames(df) = c(paste0(sprintf("S%s",seq(10,19))), paste0(sprintf("R%s",seq(20,50))), paste0(sprintf("F%s",seq(51,69))))

namelist = as.data.frame(c(paste0(sprintf("B%s",seq(10,19))), paste0(sprintf("R%s",seq(20,50))), paste0(sprintf("A%s",seq(51,69)))))
colnames(namelist) = "Code"
myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))}
namelist$Name = myFun(nrow(namelist))

我现在想重命名 df 中的列名,这些列在名称列表中。他们的新名称应该是列表中匹配代码后面的字符串。

结果应该是:保留未在名称列表中作为代码列出的列名,并将 R20-R50 替换为字符串。

我需要一个真正将代码整合为一体的解决方案,因为我也可能将代码组合为列名,如 R40+R41,不应重命名。

知道怎么做吗?

【问题讨论】:

  • 因为它是sample,如果没有set.seed,我的结果将与您的结果不同。您能否检查一下我提供的解决方案是否符合您的逻辑预期

标签: r dataframe multiple-columns matching


【解决方案1】:

我们可以使用match来获取索引

i1 <- match(colnames(df), namelist$Code)
i2 <- !is.na(i1) # to take care of non matches which are NA
names(df)[i2] <- namelist$Name[i1[i2]]
names(df)
#[1] "S10"        "S11"        "S12"        "S13"        "S14"        "S15"        "S16"        "S17"        "S18"       
#[10] "S19"        "NRROX3720Q" "AJDIO5627R" "PNGQI9045F" "PMRKH3945W" "AWTUS8801K" "FAUSS0775K" "RHMDT7354P" "EHFXN5677T"
#[19] "DEXAD5460Z" "XNPJU6465R" "ISLKV8962F" "ZVAAT4099D" "MWCLD5013G" "MSSCG1315D" "NKJBC5303V" "EDHHR9300M" "CVWHP7658I"
#[28] "BPUSL4348S" "LPEWZ1407A" "QACRV3987M" "XMHYQ8544N" "UJGRX9778J" "KPAYY3203M" "JTETK9509P" "VYNYF6624P" "RDDZD3099N"
#[37] "SHUES3288G" "CGFKB5625F" "WTUEX0452E" "BSDUR3721G" "BZMND9193I" "F51"        "F52"        "F53"        "F54"       
#[46] "F55"        "F56"        "F57"        "F58"        "F59"        "F60"        "F61"        "F62"        "F63"       
#[55] "F64"        "F65"        "F66"        "F67"        "F68"        "F69"       

即如果没有匹配,列名保持原样

【讨论】:

  • 这正是我想要的,尽管我并不真正理解它。 :) 我会查找最后一行,我根本不明白。但是非常感谢!
  • match 返回索引。如果没有匹配,默认为NA。第二行检查 NA 并在没有 NA 时返回 TRUE。我们使用那个 'i2' 来子集 'i1',同时也子集 lhs 上的列名。因为match 给出了位置,所以根据该位置获取“名称”
  • 我明白了,我了解索引的东西,但是 namelist$Name[i1[i2]],我从未见过。我不知道 [i1[i2]] 存在。
  • @Mr.Spock 这只是一个。索引上的二级索引
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2020-09-01
  • 2021-09-08
  • 2013-02-14
  • 2022-11-03
  • 2021-07-27
相关资源
最近更新 更多