拿这个样本变量
df <- data.frame(month=rep(1:3,2),
student=rep(c("Amy", "Bob"), each=3),
A=c(9, 7, 6, 8, 6, 9),
B=c(6, 7, 8, 5, 6, 7))
Run Code Online (Sandbox Code Playgroud)
我可以使用spread从tidyr将其更改为宽格式.
> df[, -4] %>% spread(student, A)
month Amy Bob
1 1 9 8
2 2 7 6
3 3 6 9
Run Code Online (Sandbox Code Playgroud)
但我怎么能传播两个值,例如既A和B,使得输出是一样的东西
month Amy.A Bob.A Amy.B Bob.B
1 1 9 8 6 5
2 2 7 6 7 6
3 3 6 9 8 7
Run Code Online (Sandbox Code Playgroud) 我想用数据在多个列上传播数据tidyr.
dat <- data.frame(ID = rep(1,10),
col1 = LETTERS[seq(1,10)],
col2 = c(letters[seq(1,8)],NA,NA),
col3 = c(rep(NA,8),"5",NA),
col4 = c(rep(NA,8),NA,"value"))
Run Code Online (Sandbox Code Playgroud)
预期结果是:
Out <- data.frame(t(c(1,letters[seq(1,8)],"5","value")),row.names=NULL)
colnames(Out) <- c("ID",LETTERS[seq(1,10)])
Run Code Online (Sandbox Code Playgroud)
我提出了:
a <- dat %>% gather(variable, value, -(ID:col1)) %>%
unite(temp, col1, variable) %>%
spread(temp, value)
a[,-which(is.na(a))]
Run Code Online (Sandbox Code Playgroud)
这是笨拙的,也改变了列名.有更好的解决方案吗?