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)

行这里是另一个使用base
R
的解决方案:

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)