R 将宽数据转换为长格式

R 将宽数据转换为长格式,r,dataframe,data-manipulation,R,Dataframe,Data Manipulation,我有一个如下所示的文件,希望将其转换为输出中给出的R数据帧 A B C D E 2010 25 74 85 88 89 2011 27 86 97 99 2012 37 115 131 2013 47 146 2014 56 输出: Year Year_No Division Amount 2010 1 A

我有一个如下所示的文件,希望将其转换为输出中给出的R数据帧

        A    B    C     D   E   
2010    25   74   85    88  89
2011    27   86   97    99  
2012    37   115  131   
2013    47   146            
2014    56  
输出:

Year  Year_No   Division   Amount 
2010    1       A          25
2010    1       B          74
2010    1       C          85
2010    1       D          88
2010    1       E          89
2011    2       A          27
2011    2       B          86
2011    2       C          97
2011    2       D          99
2012    3       A          37
2012    3       B          115
2012    3       C          131
2013    4       A          47
2013    4       B          146
2014    5       A          56
如果有人能帮我解决这个问题,我将不胜感激

我们可以将其转换为矩阵,然后将其熔化

我们可以把它转换成矩阵,然后把它熔化


我们可以使用tidyverse中的函数

资料


我们可以使用tidyverse中的函数

资料


base中的一个简单解法

# create the data
mat <- matrix(1:30,6,5)
for(z in 1:nrow(mat)){
  a <- (1:(5-z+1))*-1
  mat[z,a] <- NA
}
rownames(mat) <- 2012:2017
colnames(mat) <- LETTERS[1:5]
mat

# start the task
col <- rep(colnames(mat), each=nrow(mat))
value <- as.vector(mat)
row <- rownames(mat)
table <- data.frame(col,row,value)
table <- table[!is.na(table$value),]
table

base中的一个简单解法

# create the data
mat <- matrix(1:30,6,5)
for(z in 1:nrow(mat)){
  a <- (1:(5-z+1))*-1
  mat[z,a] <- NA
}
rownames(mat) <- 2012:2017
colnames(mat) <- LETTERS[1:5]
mat

# start the task
col <- rep(colnames(mat), each=nrow(mat))
value <- as.vector(mat)
row <- rownames(mat)
table <- data.frame(col,row,value)
table <- table[!is.na(table$value),]
table

很好的可能性阅读。tabletext=“…”,我学习如何处理用户不想使用dput的问题。在本例中,fill=T参数避免手动放置NA。@bri感谢关于fill=TRUE的提示。可能性很好,请阅读。tabletext='…',我将学习如何处理用户不想使用dput的问题。在本例中,fill=T参数避免手动放置NA。@bri感谢关于fill=TRUE的提示。
library(tidyverse)

dt2 <- dt %>%
  rownames_to_column("Year") %>%
  rowid_to_column("Year_No") %>%
  gather(Division, Amount, -Year, -Year_No, na.rm = TRUE) %>%
  arrange(Year_No, Division) %>% 
  select(Year_No, Year, Division, Amount)
dt2
   Year_No Year Division Amount
1        1 2010        A     25
2        1 2010        B     74
3        1 2010        C     85
4        1 2010        D     88
5        1 2010        E     89
6        2 2011        A     27
7        2 2011        B     86
8        2 2011        C     97
9        2 2011        D     99
10       3 2012        A     37
11       3 2012        B    115
12       3 2012        C    131
13       4 2013        A     47
14       4 2013        B    146
15       5 2014        A     56
dt <- read.table(text = "        A    B    C     D   E   
2010    25   74   85    88  89
                 2011    27   86   97    99  NA 
                 2012    37   115  131   NA  NA
                 2013    47   146  NA    NA  NA           
                 2014    56  NA  NA  NA  NA",
                 header = TRUE)
# create the data
mat <- matrix(1:30,6,5)
for(z in 1:nrow(mat)){
  a <- (1:(5-z+1))*-1
  mat[z,a] <- NA
}
rownames(mat) <- 2012:2017
colnames(mat) <- LETTERS[1:5]
mat

# start the task
col <- rep(colnames(mat), each=nrow(mat))
value <- as.vector(mat)
row <- rownames(mat)
table <- data.frame(col,row,value)
table <- table[!is.na(table$value),]
table