Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 重塑2:变量的多个观察值_R_Casting_Reshape2 - Fatal编程技术网

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

fA
dplyr/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