0

この件に関する既存の質問を見つけようとしましたが、見つけられなかったので、ここで質問しています。

概要:

複数の列から 1 つの列を作成したい。列内のすべての値は同じ順序で配置され、列は互いに下に積み重ねられる必要があります。

説明と詳細

以下は、私の csv.file がどのように見えるかの例です。ただし、400 を超える列があることに注意してください。そのため、たとえば Excel で手動で行いたくないのです。すべての列にはそれぞれ 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

要約で簡単に説明したように、すべての列を 1 つの列に「積み重ねる」必要があります。

情報: 以下の記号 "..." は、その列の残りの値を意味します。

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 行があります。11664行の1列があります。元の列が横の新しい列に書かれているとよいでしょうが (上記のように)、これは「義務」ではありません。

OBS!この df を使用して、達成したいことを一般的に示しただけなので、df に適用するので、明確で理解しやすいコマンドが高く評価されることに注意してください。

ソリューションが R で行われるか Excel で行われるかは問題ではありません。簡単にできる範囲で


私の説明が明確であることを願っています。

提案と助けに感謝します。

よろしく、 エリン

4

3 に答える 3

3

stack1 つの列で値を取得し、次の列で列名を取得するために使用できます。

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 モジュールに入力し、配列関数として =ConcatCols(A1:RL24) を入力して (Ctrl-Shift-Enter) 列 RM (または任意の場所) に連結された列全体を表示するか、VBA サブルーチンから呼び出してスプレッドシートにデータを書き込みます。

于 2015-12-27T05:34:51.553 に答える
0

以下は非常に単純ですがreshape2、ベースに含まれていると思われるパッケージをロードする必要があります。上記のように、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 に答える