Как назвать фреймы данных в порядке перестановки столбцов с использованием первой буквы

Из одного data.frame я сгенерировал столько data.frames, сколько перестановка столбцов в основном data.frame. Отсюда я хотел бы, чтобы 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, сохраняя имена предыдущих фреймов данных.


person Elixterra    schedule 20.03.2018    source источник


Ответы (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 звонков.

person Val    schedule 20.03.2018