R 数据框中的前N列及其对应的列名和行名
我有一个数据框,它用一个数字来描述用户之间的相似性。具有代表性的数据集如下所述:R 数据框中的前N列及其对应的列名和行名,r,data.table,R,Data.table,我有一个数据框,它用一个数字来描述用户之间的相似性。具有代表性的数据集如下所述: C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 R1 72 71 9 47 77 58 74 52 19 82 R2 43 25 75 100 66 97 71 76 26 57 R3 1 32 87 81 88 66 84 29 15 49 R4 66 68 22 63 40 53 32 69 5
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
R1 72 71 9 47 77 58 74 52 19 82
R2 43 25 75 100 66 97 71 76 26 57
R3 1 32 87 81 88 66 84 29 15 49
R4 66 68 22 63 40 53 32 69 57 58
R5 42 34 30 77 36 41 61 68 61 35
R6 59 23 38 3 20 86 72 81 58 1
R7 40 86 45 21 44 63 79 77 35 47
R8 15 75 15 19 34 72 96 28 24 38
R9 13 69 2 30 81 72 38 95 92 10
R10 69 26 23 100 55 10 29 16 20 38
我想要每行的顶N(例如7)列以及列名和相应的行名。因此,它可以是另一个数据帧
,如下所述。它可以是一个步骤,也可以是多个步骤,中间层数据帧形成,以实现此解决方案
col1 col2 col3
R1 C10 82
R1 C5 77
R1 C7 74
R1 C1 72
R1 C2 71
R1 C6 58
R1 C8 52
R2 C4 100
R2 C6 97
R2 C8 76
R2 C3 75
R2 C7 71
R2 C5 66
R2 C10 57
这将是一个使用
dplyr
包的解决方案。您可以使用melt
函数将第一个变量的每个条目的列变成行。然后,您只需按第一个变量分组,并为每个组排列值。最后,您可以切割任意数量的点。在我的例子中,我得到了前7名:
library(dplyr)
df %>%
melt(id.vars = first(names(.)),
measure.vars = names(.)[names(.) != first(names(.))]) %>%
group_by(!!as.name(first(names(.)))) %>%
top_n(7)
我构建它是为了使数据帧的名称可以变化。如果您的数据帧都以相同的方式命名,您只需将
first(name(.)
交换为C1
(或您喜欢的任何名称)。这不使用包。如果需要data.table结果,请将data.frame
替换为data.table
N <- 3
data.frame(row = rownames(DF),
value = t(apply(DF, 1, function(x) rev(tail(sort(x), N)))),
col = t(apply(DF, 1, function(x) rev(names(DF)[tail(order(x), N)]))))
注
可复制形式的输入DF
:
Lines <- "C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
R1 72 71 9 47 77 58 74 52 19 82
R2 43 25 75 100 66 97 71 76 26 57
R3 1 32 87 81 88 66 84 29 15 49
R4 66 68 22 63 40 53 32 69 57 58
R5 42 34 30 77 36 41 61 68 61 35
R6 59 23 38 3 20 86 72 81 58 1
R7 40 86 45 21 44 63 79 77 35 47
R8 15 75 15 19 34 72 96 28 24 38
R9 13 69 2 30 81 72 38 95 92 10
R10 69 26 23 100 55 10 29 16 20 38"
DF <- read.table(text = Lines)
行这里是另一个使用baseR
的解决方案:
D <- read.table(header=TRUE, text=
" C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
R1 72 71 9 47 77 58 74 52 19 82
R2 43 25 75 100 66 97 71 76 26 57
R3 1 32 87 81 88 66 84 29 15 49
R4 66 68 22 63 40 53 32 69 57 58
R5 42 34 30 77 36 41 61 68 61 35
R6 59 23 38 3 20 86 72 81 58 1
R7 40 86 45 21 44 63 79 77 35 47
R8 15 75 15 19 34 72 96 28 24 38
R9 13 69 2 30 81 72 38 95 92 10
R10 69 26 23 100 55 10 29 16 20 38")
top7 <- function(x) { y <- x[order(x, decreasing = TRUE)[1:7]] ; data.frame(Col=names(y), value=y)
}
L <- apply(D[,], 1, top7)
result <- L[[1]]
for (i in 2:length(L)) result <- rbind(result, L[[i]])
data.frame(Row=rep(rownames(D), each=7), result, row.names = NULL)
或(有职级)
欢迎加入,到目前为止你都做了些什么?你可能会考虑阅读一个好的问题。请阅读-总结是,这不是一个理想的方式来解决志愿者,并可能产生相反的答案。请不要将此添加到您的问题中。您可以使用top\n
而不是arrange
和slice
配对来获得更简洁的代码。您也可以使用collect
像库(tidyverse);d%%>%rownames\u to_column()%%>%gather(k,v,-rowname)%%>%groupby(rowname)%%>%top\n(7)
许多有趣的解决方案和干净的解决方案!!谢谢你们的帮忙。这是一个很大的帮助。这里的for循环对于一个大数据集来说花费了很多时间。对于(2中的i:长度(L))结果
D <- read.table(header=TRUE, text=
" C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
R1 72 71 9 47 77 58 74 52 19 82
R2 43 25 75 100 66 97 71 76 26 57
R3 1 32 87 81 88 66 84 29 15 49
R4 66 68 22 63 40 53 32 69 57 58
R5 42 34 30 77 36 41 61 68 61 35
R6 59 23 38 3 20 86 72 81 58 1
R7 40 86 45 21 44 63 79 77 35 47
R8 15 75 15 19 34 72 96 28 24 38
R9 13 69 2 30 81 72 38 95 92 10
R10 69 26 23 100 55 10 29 16 20 38")
top7 <- function(x) { y <- x[order(x, decreasing = TRUE)[1:7]] ; data.frame(Col=names(y), value=y)
}
L <- apply(D[,], 1, top7)
result <- L[[1]]
for (i in 2:length(L)) result <- rbind(result, L[[i]])
data.frame(Row=rep(rownames(D), each=7), result, row.names = NULL)
> data.frame(Row=rep(rownames(D), each=7), result, row.names = NULL)
Row Col value
1 R1 C10 82
2 R1 C5 77
3 R1 C7 74
4 R1 C1 72
5 R1 C2 71
6 R1 C6 58
7 R1 C8 52
8 R2 C4 100
9 R2 C6 97
10 R2 C8 76
11 R2 C3 75
12 R2 C7 71
13 R2 C5 66
14 R2 C10 57
15 R3 C5 88
16 R3 C3 87
17 R3 C7 84
18 R3 C4 81
19 R3 C6 66
20 R3 C10 49
21 R3 C2 32
22 R4 C8 69
23 R4 C2 68
24 R4 C1 66
25 R4 C4 63
26 R4 C10 58
27 R4 C9 57
28 R4 C6 53
29 R5 C4 77
30 R5 C8 68
31 R5 C7 61
32 R5 C9 61
33 R5 C1 42
34 R5 C6 41
35 R5 C5 36
36 R6 C6 86
37 R6 C8 81
38 R6 C7 72
39 R6 C1 59
40 R6 C9 58
41 R6 C3 38
42 R6 C2 23
43 R7 C2 86
44 R7 C7 79
45 R7 C8 77
46 R7 C6 63
47 R7 C10 47
48 R7 C3 45
49 R7 C5 44
50 R8 C7 96
51 R8 C2 75
52 R8 C6 72
53 R8 C10 38
54 R8 C5 34
55 R8 C8 28
56 R8 C9 24
57 R9 C8 95
58 R9 C9 92
59 R9 C5 81
60 R9 C6 72
61 R9 C2 69
62 R9 C7 38
63 R9 C4 30
64 R10 C4 100
65 R10 C1 69
66 R10 C5 55
67 R10 C10 38
68 R10 C7 29
69 R10 C2 26
70 R10 C3 23
data.frame(Row=rep(rownames(D), each=7), Rank=1:7, result, row.names = NULL)