R-宽到长格式的数据框,新的别名

时间:2019-06-16 17:50:57

标签: r dataframe ggplot2

我需要使用长格式数据帧才能在ggplot库中使用它。在此图形中,我需要获取x =作为条件y =计数为0和1,填充为0和1。根据我发现的需要,我需要使用长格式的数据帧,所以这是我的问题,我自己无法解决

这是我当前的数据框格式:

      C1  C2  C3    
1      0   1   0       
2      1   1   0       
3      1   0   0 

我想将其转换为新的形状,例如:

id             Conditions Values
1               C1          0
2               C1          1   
3               C1          1 
1               C2          1
2               C2          1
3               C2          0
1               C3          0
2               C3          0
1               C3          0 

我尝试使用unstack,melt,主要是重塑功能,但所有这些都没有成功,因此我不知道这是否是我要实现的正确方法/解决方案。 非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

tidyr

tidyr的{​​{1}}是最简单,最常用的选项之一。首先,您需要将行名称转换为新变量gather。我喜欢id的{​​{1}},因为我倾向于使用描述性很强的函数名,但是您可以使用任何喜欢的方法:

tibble

数据后的第一个参数(rownames_to_column告诉R在哪里存储变量名,第二个参数(library(tidyr) library(tibble) df %>% rownames_to_column("id") %>% gather(conditions, values, -id) #### OUTPUT #### id conditions values 1 1 C1 0 2 2 C1 1 3 3 C1 1 4 1 C2 1 5 2 C2 1 6 3 C2 0 7 1 C3 0 8 2 C3 0 9 3 C3 0 )告诉R在哪里存储每个前一个变量的值。 conditions只是告诉R收集除values以外的所有内容。

基本R

按照您的要求,并根据Onyambu的出色建议,以下是使用基数R的-id的方法。您可以找到有关如何使用id here的很好的详细说明。

reshape可能有点不直观且使用麻烦,这是我能想到的最痛苦的方法。它要求您在长格式数据框中添加希望值列使用的名称,在本例中为reshape。您也应该在其中放置reshape,即value。您也可以不执行此步骤,但是如果您阅读上面链接的文章,您会发现使用这种特定的命名约定可以在以后处理更复杂的情况时为您省心:

.

显然,value.C1根据行自动创建一个names(df) <- paste0("value.", names(df)) reshape(df, # data direction = "long", # long or wide varying = 1:3, # the columns that should be stacked timevar = "condition" # name of "time" variable, basically groups ) #### OUTPUT #### condition value id 1.C1 C1 0 1 2.C1 C1 1 2 3.C1 C1 1 3 1.C2 C2 1 1 2.C2 C2 1 2 3.C2 C2 0 3 1.C3 C3 0 1 2.C3 C3 0 2 3.C3 C3 0 3 变量。如果您已经在数据框中添加了reshape,它也会识别它:

id

另一个基本的R选项(贷记为Onyambu)使用的是idnames(df) <- paste0("value.", names(df)) df$id <- letters[1:3] # add an `id` variable reshape(df, direction = "long", varying = 1:3, timevar = "condition" ) #### OUTPUT #### id condition value a.C1 a C1 0 b.C1 b C1 1 c.C1 c C1 1 a.C2 a C2 1 b.C2 b C2 1 c.C2 c C2 0 a.C3 a C3 0 b.C3 b C3 0 c.C3 c C3 0 。很难将其推广到更复杂的情况,但是通过一些调整绝对可以实现。这应该可以处理示例数据,而不会出现任何问题(您需要更改一些列名):

cbind

reshape2

另一个选择是stack软件包中的cbind(id = 1:nrow(df), stack(df)) #### OUTPUT #### id values ind 1 1 0 C1 2 2 1 C1 3 3 1 C1 4 1 1 C2 5 2 1 C2 6 3 0 C2 7 1 0 C3 8 2 0 C3 9 3 0 C3 melt的使用非常简单,但是已经被reshape2取代了(有时会被melt取代):

gather

答案 1 :(得分:2)

如果只想使用reshape,则可以尝试

df <- read.table(text = "      C1  C2  C3    
1      0   1   0       
2      1   1   0       
3      1   0   0 ")
df$id <- 1:3

library(reshape)

df2 <-melt(df,id="id")
df2
  id variable value
1  1       C1     0
2  2       C1     1
3  3       C1     1
4  1       C2     1
5  2       C2     1
6  3       C2     0
7  1       C3     0
8  2       C3     0
9  3       C3     0

您也可以尝试data.tablereshape

df <- read.table(text = "      C1  C2  C3    
1      0   1   0       
2      1   1   0       
3      1   0   0 ")
df$id <- 1:3
library(reshape)
library(data.table)

setDT(df)
df2 <-melt(df,id="id")
 df2[,.(Conditions= paste0(id,",",variable),Values =value)]
   Conditions Values
1:       1,C1      0
2:       2,C1      1
3:       3,C1      1
4:       1,C2      1
5:       2,C2      1
6:       3,C2      0
7:       1,C3      0
8:       2,C3      0
9:       3,C3      0

答案 2 :(得分:1)

这是使用dplyr完成此操作的一种方法:

df <- read.table(text =
                   "C1  C2  C3 
0   1   0       
1   1   0       
1   0   0",
                 header = TRUE, stringsAsFactors = FALSE)
df%>%
  mutate(row = rownames(.))%>%
  gather(column, value, -row)