R根据另一个数据框中的匹配名称替换colnames
R Replacing colnames based on matching names in another dataframe
我想根据另一个数据框重命名数据框中的某些列。我有 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 中的列名,这些列在名称列表中。他们的新名称应该是名单中匹配代码后面的字符串。
那么结果应该是:保留namelist中没有列为代码的列名,将R20-R50替换为字符串。
我需要一个真正将代码整合为一体的解决方案,因为我也可能将代码组合为列,如 R40+R41,不应重命名。
知道怎么做吗?
我们可以使用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"
即如果没有匹配项,列名保持原样
我想根据另一个数据框重命名数据框中的某些列。我有 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 中的列名,这些列在名称列表中。他们的新名称应该是名单中匹配代码后面的字符串。
那么结果应该是:保留namelist中没有列为代码的列名,将R20-R50替换为字符串。
我需要一个真正将代码整合为一体的解决方案,因为我也可能将代码组合为列,如 R40+R41,不应重命名。
知道怎么做吗?
我们可以使用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"
即如果没有匹配项,列名保持原样