我正在学习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()
答案 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
。