R - 将空的宽数据帧转置为长无 ID 变量

R - Transpose empty wide dataframe to long no ID vars

我是 R 的新手,所以请原谅任何愚蠢的问题。

我有一个由多列组成的数据框,为了论证,让我们说 AE,所以 A, B, C, D, E

我想转置这些列以创建一个名为 Variable 的新列,它将保存 A, B, C, D, E 的值全部填充到一个新的数据框中

Variable
A
B
C
D
E

这可能吗,因为我没有尝试过诸如 MELT 或 t(x) 等作品

所以我有:

我需要:

还要说的是,变量在一个文件和另一个文件之间会有很大的不同,它们不会总是同名,所以需要像 allvars 之类的东西而不是给它们命名?

谢谢

科尔姆

如果我没理解错的话,你可以使用下面的代码。首先,创建假数据:

df <- data.frame(A = runif(10, 0, 1),
                 B = runif(10, 0, 1),
                 C = runif(10, 0, 1),
                 D = runif(10, 0, 1),
                 E = runif(10, 0, 1))

df

输出:

           A          B         C          D          E
1  0.3711955 0.60529893 0.4139218 0.38474364 0.33032247
2  0.5689305 0.08455396 0.4547466 0.50095761 0.44413510
3  0.3220088 0.42268926 0.3171933 0.30313125 0.09273389
4  0.3734473 0.90371386 0.8634857 0.66372492 0.42984325
5  0.5363005 0.64373088 0.2279042 0.11793754 0.12238873
6  0.2101622 0.64878858 0.0329526 0.01596763 0.26302076
7  0.9438709 0.84500107 0.5446587 0.27072456 0.57295920
8  0.4185947 0.33992763 0.4755329 0.36225772 0.47469022
9  0.7987066 0.84397516 0.3679846 0.87131562 0.95563427
10 0.7866157 0.46601434 0.5662175 0.66513184 0.29728068

接下来使用 reshape 包中的 melt,如下所示:

library(reshape)
melt(df)

输出:

Using  as id variables
   variable      value
1         A 0.37119552
2         A 0.56893045
3         A 0.32200884
4         A 0.37344734
5         A 0.53630053
6         A 0.21016220
7         A 0.94387092
8         A 0.41859472
9         A 0.79870656
10        A 0.78661568
11        B 0.60529893
12        B 0.08455396
13        B 0.42268926
14        B 0.90371386
15        B 0.64373088
16        B 0.64878858
17        B 0.84500107
18        B 0.33992763
19        B 0.84397516
20        B 0.46601434
21        C 0.41392181
22        C 0.45474660
23        C 0.31719334
24        C 0.86348573
25        C 0.22790422
26        C 0.03295260
27        C 0.54465868
28        C 0.47553287
29        C 0.36798461
30        C 0.56621750
31        D 0.38474364
32        D 0.50095761
33        D 0.30313125
34        D 0.66372492
35        D 0.11793754
36        D 0.01596763
37        D 0.27072456
38        D 0.36225772
39        D 0.87131562
40        D 0.66513184
41        E 0.33032247
42        E 0.44413510
43        E 0.09273389
44        E 0.42984325
45        E 0.12238873
46        E 0.26302076
47        E 0.57295920
48        E 0.47469022
49        E 0.95563427
50        E 0.29728068

如您所见,return 一个名为 variable 的列带有列名(A、B 等)和一个名为 value 的列,其中 return 是数据.

您可以使用 stack 堆叠数据帧中的向量

stack(x)
#  values ind
#1      1   A
#2      2   A
#3      3   A
#4      4   B
#5      5   B
#6      6   B
#7      7   C
#8      8   C
#9      9   C

或者您想要类似的东西?

data.frame(variable = names(x))
#  variable
#1        A
#2        B
#3        C

数据:

x <- data.frame(A = 1:3, B=4:6, C=7:9)

这是对 base R 的更新。我想我现在明白你想要什么了。

  1. 创建数据框df
  2. 然后使用 colnames() 函数将它们存储在一个新的数据框中,列名为 Variable:

更新:

df <- data.frame(VARIABLE1=character(),
                 VARIABLE2=character(), 
                 VARIABLE3=character(), 
                 VARIABLE4=character(),
                 VARIABLE5=character(),
                 stringsAsFactors=FALSE) 

df_result <- data.frame(Variable = c(colnames(df)))
df_result
   Variable
1 VARIABLE1
2 VARIABLE2
3 VARIABLE3
4 VARIABLE4
5 VARIABLE5

第一个回答:

library(tidyverse)

df <- tribble(
  ~A, ~B, ~C, ~D, ~E,
  NA_character_, NA_character_, NA_character_, NA_character_, NA_character_)

df %>% 
  pivot_longer(
    everything()
  ) %>% 
  select(1)
  name 
  <chr>
1 A    
2 B    
3 C    
4 D    
5 E   

假设你有 df:

set.seed(123)
df <- data.frame(VARIABLE1 = runif(1),
                VARIABLE2 = runif(1),
                VARIABLE3 = runif(1),
                VARIABLE4 = runif(1),
                VARIABLE5 = runif(1))

df

  VARIABLE1 VARIABLE2 VARIABLE3 VARIABLE4 VARIABLE5
1 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673

然后你可以使用tidyr来做:

library(tidyr)
pivot_longer(df, everything())

# A tibble: 5 × 2
  name      value
  <chr>     <dbl>
1 VARIABLE1 0.288
2 VARIABLE2 0.788
3 VARIABLE3 0.409
4 VARIABLE4 0.883
5 VARIABLE5 0.940