R 将宽数据转换为长格式
我有一个如下所示的文件,希望将其转换为输出中给出的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
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