从单个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
,保留以前的数据框名称。
答案 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
电话。