使用列作为类别重塑
Reshape using columns as categories
重塑此数据框的任何 R 代码来自:
big
small
year
1
70.9
60.3
2000
2
70.7
40.4
2001
3
70.8
55.2
2002
至:
size
values
year
1
big
70.9
2000
2
small
60.3
2000
3
big
70.7
2001
4
small
40.4
2001
5
big
70.8
2002
6
small
55.2
2002
在 base R 中有没有一种巧妙的方法(如果不是包解决方案也可以)?
感谢任何帮助!
您正在寻找dplyr
包
中的pivot_longer()
函数
library(dplyr)
df %>% pivot_longer(cols=c('big', 'small'), names_to='size', values_to='values'))
基本 R 选项
> cbind(year = df$year, rev(stack(df[1:2])))[order(c(row(df[1:2]))),]
year ind values
1 2000 big 70.9
4 2000 small 60.3
2 2001 big 70.7
5 2001 small 40.4
3 2002 big 70.8
6 2002 small 55.2
一个data.table
选项
> setorder(melt(setDT(df), id.vars = "year"), "year")[]
year variable value
1: 2000 big 70.9
2: 2000 small 60.3
3: 2001 big 70.7
4: 2001 small 40.4
5: 2002 big 70.8
6: 2002 small 55.2
正如 OP 提到的 base R
解决方案,这里有一个 reshape
out <- reshape(df1, idvar = "year", direction = 'long',
times = names(df1)[1:2], varying = list(1:2), timevar = "size",
v.names = "values")
row.names(out) <- NULL
-输出
> out
year size values
1 2000 big 70.9
2 2001 big 70.7
3 2002 big 70.8
4 2000 small 60.3
5 2001 small 40.4
6 2002 small 55.2
数据
df1 <- structure(list(big = c(70.9, 70.7, 70.8), small = c(60.3, 40.4,
55.2), year = 2000:2002), class = "data.frame", row.names = c("1",
"2", "3"))
重塑此数据框的任何 R 代码来自:
big | small | year | |
---|---|---|---|
1 | 70.9 | 60.3 | 2000 |
2 | 70.7 | 40.4 | 2001 |
3 | 70.8 | 55.2 | 2002 |
至:
size | values | year | |
---|---|---|---|
1 | big | 70.9 | 2000 |
2 | small | 60.3 | 2000 |
3 | big | 70.7 | 2001 |
4 | small | 40.4 | 2001 |
5 | big | 70.8 | 2002 |
6 | small | 55.2 | 2002 |
在 base R 中有没有一种巧妙的方法(如果不是包解决方案也可以)?
感谢任何帮助!
您正在寻找dplyr
包
pivot_longer()
函数
library(dplyr)
df %>% pivot_longer(cols=c('big', 'small'), names_to='size', values_to='values'))
基本 R 选项
> cbind(year = df$year, rev(stack(df[1:2])))[order(c(row(df[1:2]))),]
year ind values
1 2000 big 70.9
4 2000 small 60.3
2 2001 big 70.7
5 2001 small 40.4
3 2002 big 70.8
6 2002 small 55.2
一个data.table
选项
> setorder(melt(setDT(df), id.vars = "year"), "year")[]
year variable value
1: 2000 big 70.9
2: 2000 small 60.3
3: 2001 big 70.7
4: 2001 small 40.4
5: 2002 big 70.8
6: 2002 small 55.2
正如 OP 提到的 base R
解决方案,这里有一个 reshape
out <- reshape(df1, idvar = "year", direction = 'long',
times = names(df1)[1:2], varying = list(1:2), timevar = "size",
v.names = "values")
row.names(out) <- NULL
-输出
> out
year size values
1 2000 big 70.9
2 2001 big 70.7
3 2002 big 70.8
4 2000 small 60.3
5 2001 small 40.4
6 2002 small 55.2
数据
df1 <- structure(list(big = c(70.9, 70.7, 70.8), small = c(60.3, 40.4,
55.2), year = 2000:2002), class = "data.frame", row.names = c("1",
"2", "3"))