使用其他数据框中的名称重命名列

时间:2016-08-12 15:22:35

标签: r

我正在学习R编程已经遇到了一些问题 - 并且在你的帮助下已经能够修复它们。

但我现在需要重命名数据框的列。我有一个包含2列的转换数据框,其中包含列名称以及应该调用新列的内容。

以下是我的代码:我的问题是如何从 trans 数据框中选择两列,并在此处将它们用作 trans $ old trans $新的变量?

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

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

replaced_industries <- replace_header()

3 个答案:

答案 0 :(得分:3)

以下是使用内置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查找&#34; old&#34;的索引。 mt数据框中的名称:

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

代替&#34; old&#34;姓名用&#34; new&#34;名称:

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

答案 1 :(得分:0)

如果我们想使用“重命名数据框”,而其旧名称并不总是出现在mt数据框上(例如,因为mt由不同的来源提供,因此我们并不总是知道其同名),则可以改善eipi10的答案。可以考虑以下代码

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

答案 2 :(得分:0)

为此,我建议使用“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