如何使用第一个字母按列的排列顺序命名数据框

时间:2018-03-20 10:47:26

标签: r dplyr rename permutation cbind

从单个data.frame中,我生成了与主data.frame中列的排列一样多的data.frames。从这里开始,我希望1)每个置换data.frame以置换顺序命名,方法是保留每个列名的第一个字母,2)cbind每个data.frames与另一个:

data1 <- data.frame("Alpha"=c(1,2), "Beta"=c(2,2), "Gamma"=c(4,8))
data2 <- data.frame("Delta"=c(22,3))

library(combinat)
idx <- permn(ncol(data1))
res <- lapply(idx, function(x) data1[x])
res
[[1]]
  Alpha Beta Gamma
1     1    2     4
2     2    2     8

[[2]]
  Alpha Gamma Beta
1     1     4    2
2     2     8    2

[[3]]
  Gamma Alpha Beta
1     4     1    2
2     8     2    2

...

[[6]]
  Beta Alpha Gamma
1    2     1     4
2    2     2     8

首先,我希望通过保留每个列名的第一个字母,使每个以前的data.frame以排列顺序命名,以便它显示以下data.frames:

dataABG
  Alpha Beta Gamma
1     1    2     4
2     2    2     8

dataAGB
  Alpha Gamma Beta
1     1     4    2
2     2     8    2

dataGAB
  Gamma Alpha Beta
1     4     1    2
2     8     2    2

...

然后,我希望cbind每个先前的数据框data2,保留以前的数据框名称。

1 个答案:

答案 0 :(得分:1)

您可以使用lapply创建名称,并对各个数据框的列名称进行子字符串操作。当然,这假设您要将所有列的每个首字母添加到名称中:

names(res) <- unlist(lapply(res,function(x) sprintf('data%s',paste0(substr(colnames(x),1,1),collapse = ''))))

res

# $dataABG
# Alpha Beta Gamma
# 1     1    2     4
# 2     2    2     8
# 
# $dataAGB
# Alpha Gamma Beta
# 1     1     4    2
# 2     2     8    2
# 
# $dataGAB
# Gamma Alpha Beta
# 1     4     1    2
# 2     8     2    2

现在要追加data2中的列,您可以再次使用lapply

lapply(res,function(x) cbind(x,data2))

# $dataABG
# Alpha Beta Gamma Delta
# 1     1    2     4    22
# 2     2    2     8     3
# 
# $dataAGB
# Alpha Gamma Beta Delta
# 1     1     4    2    22
# 2     2     8    2     3
# 
# $dataGAB
# Gamma Alpha Beta Delta
# 1     4     1    2    22
# 2     8     2    2     3

编辑:

为了最大限度地减少lapply的使用,您在选择排名时可以cbind data2列,然后将其从名称创建中排除:

library(combinat)
idx <- permn(ncol(data1))
res <- lapply(idx, function(x) cbind(data1[x],data2))

names(res) <- unlist(lapply(res,function(x) sprintf('data%s',paste0(str_sub(colnames(x)[-length(colnames(x))],1,1),collapse = ''))))

这将为您节省一整天的lapply电话。