假设我有一个数据框,其中一列是重复值(日期,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
进入这个:
aa bb cc
1 30 20 40
2 40 12 31
3 10 15 12
以下是一些代码,用于生成第一个数据框的样本:
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)
我不确定如何转置它。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
说明,参数key = b
允许您在数据框中指定一列。 spread
将为密钥列b
中的每个唯一条目创建一个新列。参数value = c
告诉spread
检索列c
中的值,并将其写入相应的新key
列。
答案 3 :(得分:4)
如果每组中的观察数量始终相同,那么split
然后as.data.frame
as.data.frame(split(d$c, d$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
答案 4 :(得分:0)
使用split和cbind:
> ll = lapply(split(d, d$b), function(x) x[3])
> dd = do.call(cbind, ll)
> names(dd) = names(ll)
> dd
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