0

我试图在这个问题上找到一个已经存在的问题,但我找不到,这就是我在这里问你的原因:

概括:

我想从几列中制作一列。列中的所有值都按相同的顺序放置,并且列应堆叠在彼此下方。

描述和细节

下面是我的 csv.file 外观的示例。但是,请注意有 >400 列,这就是为什么我不想在例如 Excel 中手动执行此操作。ALL 列每列有 24 行。

X1  X2  X3  X4  X5  X6 ... X470
0   1   5   10  8   0      7
0   0   0   0   0   0      0
2   3   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0
0   0   0   0   0   0      0

正如我在摘要中简短描述的那样,我想将所有列“堆叠”在一列中:

信息:下面的符号“...”表示该列中的其余值。

VALUE  FROM COLUMN
0      X1   
0      X1   
2      X1   
...     
1      X2       
0      X2   
3      X2
...     
5      X3   
...     
10     X4
...  
8      X5
... 
0      X6
... 
7      X470
...

所以最后,而不是有 486 列,每列有 24 行。我将有 1 列 11664 行。如果原始列写在侧面的新列中会很好(如上所示),但这不是“义务”。

OBS!请注意,我使用这个 df 只是大致展示了我想要实现的目标,因此感谢清晰易懂的命令,因为我会将其应用于我的 df。

解决方案是在 R 还是 Excel 中完成都没有关系!只要容易做到


我希望我的描述清楚,否则请告诉我,以便我再次尝试描述。

非常感谢您的建议和帮助。

亲切的问候,艾琳

4

3 回答 3

3

我们可以stack用来获取一列中的值和下一列中的列名。

stack(df)

或使用unlist

data.frame(VALUE=unlist(df),
          fromColumn= rep(names(df), each=nrow(df)))
于 2015-12-26T17:45:33.200 回答
1

这是一个 VBA 用户定义的函数来完成这项工作:

Function ConcatCols(Colrange As Variant) As Variant
Dim LongCol() As Variant, i As Long, j As Long, k As Long
Dim NumCols As Long, NumRows As Long, NumRows2 As Long

If TypeName(Colrange) = "Range" Then Colrange = Colrange.Value2

NumRows = UBound(Colrange)
NumCols = UBound(Colrange, 2)
NumRows2 = NumRows * NumCols
ReDim LongCol(1 To NumRows2, 1 To 1)

k = 1
For i = 1 To NumCols
    For j = 1 To NumRows
        LongCol(k, 1) = Colrange(j, i)
        k = k + 1
    Next j
Next i
ConcatCols = LongCol
End Function

在 VBA 模块中输入代码,然后在 RM 列(或任何您想要的位置)中输入 =ConcatCols(A1:RL24) 作为数组函数 (Ctrl-Shift-Enter) 以查看整个串联列,或从 VBA 子调用将数据写入电子表格。

于 2015-12-27T05:34:51.553 回答
0

以下内容非常简单,但需要加载reshape2我认为包含在 base.xml 中的包。如上所述,stack()给出类似的输出,但反转列。

library(reshape2)

df <- data.frame("A" = 1:21, "B" = 21:41, "C" = 40:60)

> df
    A  B  C
1   1 21 40
2   2 22 41
3   3 23 42
4   4 24 43
5   5 25 44
6   6 26 45
7   7 27 46
8   8 28 47
9   9 29 48
10 10 30 49
11 11 31 50
12 12 32 51
13 13 33 52
14 14 34 53
15 15 35 54
16 16 36 55
17 17 37 56
18 18 38 57
19 19 39 58
20 20 40 59
21 21 41 60

melt(df)

> melt(df)
No id variables; using all as measure variables
  variable value
1         A     1
2         A     2
3         A     3
4         A     4
5         A     5
6         A     6
7         A     7
8         A     8
9         A     9
10        A    10
11        A    11
12        A    12
13        A    13
14        A    14
15        A    15
16        A    16
17        A    17
18        A    18
19        A    19
20        A    20
21        A    21
22        B    21
23        B    22
24        B    23
25        B    24
26        B    25
27        B    26
28        B    27
29        B    28
30        B    29
31        B    30
32        B    31
33        B    32
34        B    33
35        B    34
36        B    35
37        B    36
38        B    37
39        B    38
40        B    39
41        B    40
42        B    41
43        C    40
44        C    41
45        C    42
46        C    43
47        C    44
48        C    45
49        C    46
50        C    47
51        C    48
52        C    49
53        C    50
54        C    51
55        C    52
56        C    53
57        C    54
58        C    55
59        C    56
60        C    57
61        C    58
62        C    59
63        C    60
于 2015-12-28T14:27:42.743 回答