动态重命名变量

时间:2019-12-04 10:51:22

标签: r

我有一个名为“ schema”的文件。基于该文件,我需要重命名其他数据框。例如,需要将TableA的“ Var1”重命名为“ Col1”。同样,TableA的VarA需要重命名为ColA。简而言之,模式“ FROM”列中列出的所有变量都需要重命名为“ To”列。

Schema <- read.table(header = TRUE, text = 
                  'Tables   From    To
                A   Var1    Col1
                A   Var2    Col2
                A   Var3    Col3
                B   VarA    ColA
                B   VarB    ColB
                B   VarC    ColC
                ')


A <- data.frame(Var1 = 1:3,
                  Var2 = 2:4,
                  Var3 = 3:5)

B <- data.frame(VarA = 1:3,
                VarB = 2:4,
                VarC = 3:5)

3 个答案:

答案 0 :(得分:2)

我们可以使用 match

lapply(list(A = A, B = B), function(i){
  setNames(i, Schema$To[ match(names(i), Schema$From) ])
 })

# $A
#   Col1 Col2 Col3
# 1    1    2    3
# 2    2    3    4
# 3    3    4    5
# 
# $B
#   ColA ColB ColC
# 1    1    2    3
# 2    2    3    4
# 3    3    4    5

或者:

Anew <- setNames(A, Schema$To[ match(names(A), Schema$From) ])
Bnew <- setNames(B, Schema$To[ match(names(B), Schema$From) ])

list2env

list2env(lapply(list(A = A, B = B), function(i){
  setNames(i, Schema$To[ match(names(i), Schema$From) ])
  }), envir = globalenv())

编辑::如果没有匹配的架构,请按原样使用保持列名称:

list2env(lapply(list(A = A, B = B), function(i){
  # check if there is a match, if not keep name unchaged
  x <- as.character(Schema$To[ match(names(i), Schema$From) ])
  ix <- which(is.na(x))
  x[ ix ] <- names(i)[ ix ]
  # retunr with updated names
  setNames(i, x)
  }), envir = globalenv())

答案 1 :(得分:1)

  • 以下代码可以从npm run build提取表的名称(AB)并进行名称替换任务:
Schema

给出

r <- Map(function(v) function(v) {
  r <- get(v)
  names(r)[names(r) %in% Schema$From] <- as.character(Schema$To[Schema$From %in% names(r)])
  assign(v,r)},
    as.character(unique(Schema$Tables)))
  • 如果您不想将结果作为列表,则可以执行类似的操作
> r
$A
  Col1 Col2 Col3
1    1    2    3
2    2    3    4
3    3    4    5

$B
  ColA ColB ColC
1    1    2    3
2    2    3    4
3    3    4    5

list2env(Map(function(v) {
  r <- get(v)
  names(r)[names(r) %in% Schema$From] <- as.character(Schema$To[Schema$From %in% names(r)])
  assign(v,r)},
  as.character(unique(Schema$Tables))),envir = .GlobalEnv)

然后您将保留对象for (v in as.character(unique(Schema$Tables))) { r <- get(v) names(r)[names(r) %in% Schema$From] <- as.character(Schema$To[Schema$From %in% names(r)]) assign(v,r) } A

B

答案 2 :(得分:1)

lut <- setNames(as.character(Schema$To), Schema$From)

setNames(A, lut[names(A)])

  Col1 Col2 Col3
1    1    2    3
2    2    3    4
3    3    4    5

setNames(B, lut[names(B)])

  ColA ColB ColC
1    1    2    3
2    2    3    4
3    3    4    5