首先按固定顺序的子组重新排序data.frame列,然后按字母顺序在每个子组内重新排序

时间:2015-10-15 12:11:53

标签: r

我需要根据两个条件重新排序庞大的data.frame列。第一个是基于列前缀的固定顺序(我使用它作为一种列类别)。在每个类别中,订单都是字母。

换句话说:

  • 首先基于前缀的固定订单 - &gt; &#34;&#34; {no prefix},&#34; details&#34;,&#34; attributes&#34;,&#34; stats&#34;,&#34; poll&#34;,&#34; endpoint&#34; < / p>

  • 然后,按字母顺序在每个子组内

这是一个可重现的数据集,用于播放:

blah <- data.frame("id"=1,                                                         
                   "details.thumbnail"=1,                                          
                   "details.image"=1,
                   "type"=1,                                                       
                   "name"=1,                                               
                   "attributes.num"=1,                                             
                   "attributes.boardgamemechanic"=1,                               
                   "attributes.boardgameexpansion"=1,                              
                   "stats.averageweight.value"=1,                                  
                   "poll.results.suggested_numplayers.7.Recommended.numvotes"=1,
                   "poll.results.suggested_numplayers.7.NotRecommended.numvotes"=1,
                   "attributes.boardgamemechanic"=1,   
                   "endpoint.uri"=1) 

我真的很困惑,因为我写的每一个解决方案都非常奇怪,而且确实不优雅。

1 个答案:

答案 0 :(得分:1)

以这种方式:

cols <- c("^([^.]+)$", "^(details)", "^(attributes)", "^(stats)", "^(poll)", "^(endpoint)")
s <- names(blah)
n <- seq_along(cols)
for(i in n) s <- sub(cols[i], paste0(n[i], "\\1"), s)
new_vec <- substr(s[order(s)], 2, nchar(s[order(s)]))
new_vec
#  [1] "id"                                                         
#  [2] "name"                                                       
#  [3] "type"                                                       
#  [4] "details.image"                                              
#  [5] "details.thumbnail"                                          
#  [6] "attributes.boardgameexpansion"                              
#  [7] "attributes.boardgamemechanic"                               
#  [8] "attributes.boardgamemechanic.1"                             
#  [9] "attributes.num"                                             
# [10] "stats.averageweight.value"                                  
# [11] "poll.results.suggested_numplayers.7.NotRecommended.numvotes"
# [12] "poll.results.suggested_numplayers.7.Recommended.numvotes"   
# [13] "endpoint.uri" 

我们使用正则表达式来查找前缀和非前缀列名。 cols变量按问题中列出的顺序创建。为每个查找添加一个数字。如果未找到1附加的前缀,则details会附加2。等等。我使用for循环,因为它最适合在一次迭代中操作并保存下一次的结果。 order这个新的名字向量很容易。然后取消附加的数字以使用blah[,new_vec]进行子集化。