我需要根据两个条件重新排序庞大的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)
我真的很困惑,因为我写的每一个解决方案都非常奇怪,而且确实不优雅。
答案 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]
进行子集化。