将数据框常用行转换为列

Jef*_*mer 2 r reshape

假设我有一个数据框,其中一列是一些重复值(日期,ID等).有没有办法将数据框转换为带有列的现在数据框而不是复制行?基本上我想要转置这样的东西:

col1 col2 col3
1    aa   30
2    aa   40
3    aa   10
1    bb   20
2    bb   12
3    bb   15
1    cc   40
2    cc   31
3    cc   12
Run Code Online (Sandbox Code Playgroud)

进入:

    aa   bb   cc
1   30   20   40
2   40   12   31
3   10   15   12
Run Code Online (Sandbox Code Playgroud)

以下是一些代码,用于生成第一个数据框的示例:

a <- c(rep(1:10, 3))
b <- c(rep("aa", 10), rep("bb", 10), rep("cc", 10))
set.seed(123)
c <- sample(seq(from = 20, to = 50, by = 5), size = 30, replace = TRUE)
d <- data.frame(a,b, c)
Run Code Online (Sandbox Code Playgroud)

我不确定如何转置它.

Jas*_*son 6

a <- c(rep(1:10, 3))
b <- c(rep("aa", 10), rep("bb", 10), rep("cc", 10))
set.seed(123)
c <- sample(seq(from = 20, to = 50, by = 5), size = 30, replace = TRUE)
d <- data.frame(a,b, c)
#how to transpose it#
e<-reshape(d,idvar='a',timevar='b',direction='wide')
e
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 6

这也是您可以使用的情况unstack:

unstack(d, c ~ b)
#    aa bb cc
# 1  30 50 50
# 2  45 35 40
# 3  30 40 40
# 4  50 40 50
# 5  50 20 40
# 6  20 50 40
# 7  35 25 35
# 8  50 20 40
# 9  35 30 30
# 10 35 50 25
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

使用您的数据框d,

library(tidyr)
> spread(d, key = b, value = c)
    a aa bb cc
1   1 30 50 50
2   2 45 35 40
3   3 30 40 40
4   4 50 40 50
5   5 50 20 40
6   6 20 50 40
7   7 35 25 35
8   8 50 20 40
9   9 35 30 30
10 10 35 50 25
Run Code Online (Sandbox Code Playgroud)

说明,该参数key = b允许您在数据框中指定一列.spread将为键列中的每个唯一条目创建一个新列b.参数value = c告诉spread我们在列中检索值c并将其写入相应的新key列中.