从多个Rstudio或Excel列中创建一列

时间:2015-12-26 17:40:52

标签: r excel col

我试图在这件事上找到一个已经存在的问题,但我不能这就是为什么我在这里问你:

要点:

我想从几个列中创建一个列。列中的所有值都按照它们的顺序放置,并且列应该堆叠在彼此之下。

描述和细节

以下是我的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

我想"堆叠"正如我在摘要中简要描述的那样,列中的所有列都是:

信息:标志" ..."下面表示该列的其余值。

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行。如果将原始列写在一侧的新列中(如上所示),那将是好的,但这不是"义务"。

OBS!请注意,我使用此df只是显示了我想要实现的内容,所以我会将它应用到我的df中,因此可以理解清晰易懂的命令。

如果解决方案是在R或Excel中完成的,那无关紧要!只要很容易就做

我希望我的描述清楚,否则请让我知道,以便我可以尝试再次描述。

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

亲切的问候,艾琳

3 个答案:

答案 0 :(得分:3)

我们可以使用stack获取一列中的值,然后使用下一列中的列号。

stack(df)

或使用unlist

data.frame(VALUE=unlist(df),
          fromColumn= rep(names(df), each=nrow(df)))

答案 1 :(得分: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 sub将数据写入电子表格。

答案 2 :(得分: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