像这样生成df1
和df2
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
代码,但我不确定是否可以轻松修复列交换更加动态。
答案 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)
这将考虑您在分配给列名时的预期排序。