R 重塑2:变量的多个观察值
我有以下样本数据:R 重塑2:变量的多个观察值,r,casting,reshape2,R,Casting,Reshape2,我有以下样本数据: d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5)) id time var 1 1 1 0.373448545 2 1 1 0.007007124 3 1 1 0.840572603 4 2 1 0.684893481 5 2 1 0.822581501 有人有什么想法吗?通过id创建一个序列列seq,然后使用dcast: lib
d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))
id time var
1 1 1 0.373448545
2 1 1 0.007007124
3 1 1 0.840572603
4 2 1 0.684893481
5 2 1 0.822581501
有人有什么想法吗?通过
id
创建一个序列列seq
,然后使用dcast
:
library(reshape2)
set.seed(123)
d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))
d2 <- transform(d, seq = ave(id, id, FUN = seq_along))
dcast(d2, id ~ seq, value.var = "var")
好的-这里有一个有效的解决方案。关键是添加一个计数变量。我的解决方案有点复杂-也许你能想出更好的办法
library(dplyr)
library(magrittr)
library(reshape2)
d <- data.frame(id=c(1,1,1,2,2,3,3,3,3), time=c(1,1,1,1,1,1,1,1,1), var=runif(9))
group_by(d, id) %>%
summarise(n = n()) %>%
data.frame() -> count
f <- c()
for (i in 1:nrow(count)) {
f <- c(f, 1:count$n[i])
}
d <- data.frame(d, f)
dcast(d, id ~ f, value.var = "var")
库(dplyr)
图书馆(magrittr)
图书馆(E2)
d%
总结(n=n())%>%
data.frame()->count
fAdplyr/tidyr
带有价差的选项将是
library(dplyr)
library(tidyr)
d %>%
group_by(id) %>%
mutate(n1= paste0("var.",row_number())) %>%
spread(n1, var) %>%
select(-time)
# id var.1 var.2 var.3
# (int) (dbl) (dbl) (dbl)
#1 1 0.3734485 0.007007124 0.8405726
#2 2 0.6848935 0.822581501 NA
有趣-此代码在示例数据上运行良好。但是当我在原始数据上使用这段代码时,第一行的输出并不是沿着变量水平分布的(就像我们想要的那样),而是垂直分布的,这样它就被粘贴到变量1的第二行和第三行。有人知道为什么会这样吗?这一转变运作良好。
library(dplyr)
library(magrittr)
library(reshape2)
d <- data.frame(id=c(1,1,1,2,2,3,3,3,3), time=c(1,1,1,1,1,1,1,1,1), var=runif(9))
group_by(d, id) %>%
summarise(n = n()) %>%
data.frame() -> count
f <- c()
for (i in 1:nrow(count)) {
f <- c(f, 1:count$n[i])
}
d <- data.frame(d, f)
dcast(d, id ~ f, value.var = "var")
library(dplyr)
library(tidyr)
d %>%
group_by(id) %>%
mutate(n1= paste0("var.",row_number())) %>%
spread(n1, var) %>%
select(-time)
# id var.1 var.2 var.3
# (int) (dbl) (dbl) (dbl)
#1 1 0.3734485 0.007007124 0.8405726
#2 2 0.6848935 0.822581501 NA