【问题标题】:How to name dataframes by permutation order of columns using first letter如何通过使用第一个字母的列的排列顺序来命名数据帧
【发布时间】:2018-08-29 03:32:26
【问题描述】:

从单个 data.frame 中,我生成了与主 data.frame 中列的排列一样多的 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

...

然后,我想用data2 cbind 之前的每个数据帧,保留之前的数据帧名称。

【问题讨论】:

    标签: r dplyr rename permutation cbind


    【解决方案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 电话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多