排序数据框以获得所需的形式
Sorting dataframe to achieve desired form
大家早上好
我有以下例子:
data <- data.frame(matrix(0, nrow = 3, ncol = 5))
colnames(data) = paste("art_", 1:5, sep = "")
rownames(data) = paste("use_", 1:3, sep = "")
data["use_1",c("art_1","art_2","art_3")] = 1
data["use_2",c("art_2","art_3")] = 1
data["use_3",c("art_1","art_2","art_3","art_4","art_5")] = 1
#This is how the table looks like:
art_1 art_2 art_3 art_4 art_5
use_1 1 1 1 0 0
use_2 0 1 1 0 0
use_3 1 1 1 1 1
现在我想重新排列或排序行和列,以便所有带有 1 的条目都分组在左上角。
这是重新排列后的样子:
art_2 art_3 art_1 art_4 art_5
use_3 1 1 1 1 1
use_1 1 1 1 0 0
use_2 1 1 0 0 0
非常感谢您的任何提示和帮助。
干杯
您可以使用以下代码:
data[order(rowSums(data), decreasing=TRUE), order(colSums(data), decreasing=TRUE)]
输出:
art_2 art_3 art_1 art_4 art_5
use_3 1 1 1 1 1
use_1 1 1 1 0 0
use_2 1 1 0 0 0
使用 apply
,按行排序 (MARGIN = 1
),然后按列排序 (MARGIN = 2
):
data[] <- t(apply(data, 1, sort, decreasing = T))
data[] <- apply(data, 2, sort, decreasing = T)
art_1 art_2 art_3 art_4 art_5
use_1 1 1 1 1 1
use_2 1 1 1 0 0
use_3 1 1 0 0 0
另一个可能的解决方案:
data[names(sort(apply(data, 2, sum), decreasing = T))]
#> art_2 art_3 art_1 art_4 art_5
#> use_1 1 1 1 0 0
#> use_2 1 1 0 0 0
#> use_3 1 1 1 1 1
大家早上好
我有以下例子:
data <- data.frame(matrix(0, nrow = 3, ncol = 5))
colnames(data) = paste("art_", 1:5, sep = "")
rownames(data) = paste("use_", 1:3, sep = "")
data["use_1",c("art_1","art_2","art_3")] = 1
data["use_2",c("art_2","art_3")] = 1
data["use_3",c("art_1","art_2","art_3","art_4","art_5")] = 1
#This is how the table looks like:
art_1 art_2 art_3 art_4 art_5
use_1 1 1 1 0 0
use_2 0 1 1 0 0
use_3 1 1 1 1 1
现在我想重新排列或排序行和列,以便所有带有 1 的条目都分组在左上角。 这是重新排列后的样子:
art_2 art_3 art_1 art_4 art_5
use_3 1 1 1 1 1
use_1 1 1 1 0 0
use_2 1 1 0 0 0
非常感谢您的任何提示和帮助。
干杯
您可以使用以下代码:
data[order(rowSums(data), decreasing=TRUE), order(colSums(data), decreasing=TRUE)]
输出:
art_2 art_3 art_1 art_4 art_5
use_3 1 1 1 1 1
use_1 1 1 1 0 0
use_2 1 1 0 0 0
使用 apply
,按行排序 (MARGIN = 1
),然后按列排序 (MARGIN = 2
):
data[] <- t(apply(data, 1, sort, decreasing = T))
data[] <- apply(data, 2, sort, decreasing = T)
art_1 art_2 art_3 art_4 art_5
use_1 1 1 1 1 1
use_2 1 1 1 0 0
use_3 1 1 0 0 0
另一个可能的解决方案:
data[names(sort(apply(data, 2, sum), decreasing = T))]
#> art_2 art_3 art_1 art_4 art_5
#> use_1 1 1 1 0 0
#> use_2 1 1 0 0 0
#> use_3 1 1 1 1 1