【问题标题】:Rename Columns with names from another data frame使用另一个数据框中的名称重命名列
【发布时间】:2016-08-12 15:22:34
【问题描述】:

我正在学习 R 编程,因此遇到了一些问题 - 在您的帮助下已经能够解决这些问题。

但我现在需要重命名数据框的列。我有一个包含 2 列的翻译数据框,其中包含列名和新列的名称。

这是我的代码:我的问题是如何从 trans 数据框中选择两列并将它们用作 trans$oldtrans$新的变量?

我有 7 列要重命名,因此转换表可能会更长。

replace_header <- function()
{      
  names(industries)[names(industries)==trans$old] <- trans$new
  replaced <- industries
  return (replaced)
}  

replaced_industries <- replace_header()

【问题讨论】:

  • 使用colnames函数。
  • 您可能需要match 函数。
  • @nrussell 谢谢,我如何才能使用匹配?请原谅我的无知:(
  • 您需要在问题中包含dput(industries)dput(trans) 的输出。
  • @Warner,用索引替换似乎容易出错。按名称匹配更安全。

标签: r


【解决方案1】:

这是一个使用内置 mtcars 数据框的示例。我们将使用match 函数来查找我们要替换的列名的索引,然后用新名称替换它们。

# Copy of built-in data frame
mt = mtcars

head(mt,3)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Data frame with column name substitutions
dat = data.frame(old=c("mpg","am"), new=c("new.name1","new.name2"), stringsAsFactors=FALSE)

dat
  old       new
1 mpg new.name1
2  am new.name2

使用match 查找mt 数据框中“旧”名称的索引:

match(dat[,"old"], names(mt))
[1] 1 9

用“新”名称替换“旧”名称:

names(mt)[match(dat[,"old"], names(mt))] = dat[,"new"]

head(mt,3)
                  new.name1 cyl disp  hp drat    wt  qsec vs new.name2 gear carb
Mazda RX4              21.0   6  160 110 3.90 2.620 16.46  0         1    4    4
Mazda RX4 Wag          21.0   6  160 110 3.90 2.875 17.02  0         1    4    4
Datsun 710             22.8   4  108  93 3.85 2.320 18.61  1         1    4    1

【讨论】:

  • 为什么要投反对票?这基本上是我在读取带有愚蠢的 col 名称的数据时所做的。
  • 只是好奇,为什么投反对票?如果您认为我做的事情不正确或不够理想,请告诉我,以便我改进代码。
  • @eipi10 感谢上面的代码。我正在努力寻找如何使它适合我上面的小功能。有人可以帮助指出如何改进吗?谢谢
  • 我不认为你需要一个新的功能来做到这一点。只需names(industries)[match(trans[ ,"old"], names(industries)] = trans[ ,"new"]
  • @eipi10 - 感谢上面的代码。匹配功能按照您的建议为我完成了。我无法告诉你看到它工作的感觉有多激动。我知道……我知道……我很兴奋。我喜欢 R 编程。
【解决方案2】:

稍微改进 eipi10 的回答,如果我们想使用旧名称的“重命名数据帧”,旧名称并不总是出现在 mt 数据帧上(例如,因为 mt 由不同的来源提供,所以我们并不总是知道它的 colnames)我们可以考虑下面的代码

mt = mtcars

head(mt,3)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1   4     4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1   4     4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1   4     1
# dataframe with possible names to replace
dat = data.frame(old=c("strangeName","am"), new=c("new.name1","new.name2"), stringsAsFactors=FALSE)
# find which old names are present in mt
namesMatched <- dat[dat$old %in% names(mt)
#renaming
names(mt)[match(namesMatched,"old"], names(mt))] = dat[namesMatched,"new"]

head(mt,3)
                   mpg cyl disp  hp drat    wt  qsec vs new.name2 gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0     1       4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0     1       4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1     1       4    1

【讨论】:

    【解决方案3】:

    我会为此推荐来自“data.table”的setnames。使用@eipi10 的例子:

    mt = mtcars
    dat = data.frame(old=c("mpg","am"), new=c("new.name1","new.name2"), stringsAsFactors=FALSE)
    
    library(data.table)
    setnames(mt, dat$old, dat$new)
    names(mt)
    #  [1] "new.name1" "cyl"       "disp"      "hp"        "drat"      "wt"       
    #  [7] "qsec"      "vs"        "new.name2" "gear"      "carb" 
    

    如果@jmbadia 表示担心data.frame 具有旧名称和新名称,您可以将skip_absent=TRUE 添加到setnames

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 2018-01-04
      • 2020-01-30
      • 2021-11-15
      • 2018-08-16
      • 2011-10-02
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多