动态列重命名基于R

时间:2017-08-18 22:20:48

标签: r indexing

像这样生成df1df2

pro <- c("Hide-Away", "Hide-Away")
sourceName <- c("New Rate2", "FST")
standardName <- c("New Rate", "SFT") 
df1 <- data.frame(pro, sourceName, standardName, stringsAsFactors = F)
A <- 1; B <- 2; C <-3; D <- 4; G <- 5; H <- 6; E <-7; FST <-8; Z <-8
df2<- data.frame(A,B,C,D,G,H,E,FST)
colnames(df2)[1]<- "New Rate2"

然后运行此代码。

df1 <- df1[,c(2,3)]
index<-which(colnames(df2) %in% df1[,1])
index2<-which(df1[,1] %in% colnames(df2) )
colnames(df2)[index] <- df1[index2,2]

DF2的输入将类似于

  New Rate2 B C D G H E FST
          1 2 3 4 5 6 7   8

DF2的输出将类似于

  New Rate B C D G H E SFT
         1 2 3 4 5 6 7   8

很明显,代码正常工作并正确地交换了名称。但现在使用以下代码创建df2。并确保将df1重新生成之前的版本。

df2<- data.frame(FST,B,C,D,G,H,E,Z)
colnames(df2)[8]<- "New Rate2"

然后运行

df1 <- df1[,c(2,3)]
index<-which(colnames(df2) %in% df1[,1])
index2<-which(df1[,1] %in% colnames(df2) )
colnames(df2)[index] <- df1[index2,2]

df2的输入将是

 FST B C D G H E New Rate2
   8 2 3 4 5 6 7         8

df2的输出将是

New Rate B C D G H E SFT
       8 2 3 4 5 6 7   8

因此未保留列的顺序。我知道这是因为%in代码,但我不确定是否可以轻松修复列交换更加动态。

2 个答案:

答案 0 :(得分:1)

我对这个问题并不十分肯定,因为它看起来有点模糊。我会尽我所能 - 我知道动态设置列名的最佳方法是setnames包中的data.table。所以,假设我有一组源名称和一组标准名称,我想交换标准的源代码(我认为这是问题)。

鉴于上面的数据,我有一个像这样结构的data.frame:

> df2
  A B C D G H E FST
1 1 2 3 4 5 6 7   8

以及两个向量,sourceName和standardName。

sourceName <- c("A", "FST")
standardName <- c("New A", "FST 2: Electric Boogaloo") 

我想动态地为sourceName交换sourceName,我可以像setnames一样这样做:

df3 <- as.data.table(df2)
setnames(df3, sourceName, standardName)

> df3
   New A B C D G H E FST 2: Electric Boogaloo
1:     1 2 3 4 5 6 7                        8

答案 1 :(得分:0)

尝试按照您的示例,在第二次传递中,我得到索引值为0,

> df2
  New Rate B C D G H E SFT
1        8 2 3 4 5 6 7   8
> df1
  sourceName standardName
1  New Rate2     New Rate
2        FST          SFT
> index<-which(colnames(df2) %in% df1[,1])
> index
integer(0)

这将考虑您在分配给列名时的预期排序。