扩展数据行

时间:2016-12-15 06:09:39

标签: r dplyr expand tidyr

我有一个扩展数据框行的问题。我在expand链中tidyr尝试了dplyr。关键是看起来这个函数正在扩展数据,但是通过改变不需要的扩展元素的顺序。我希望在展开后保持sp列的顺序。

这是我的尝试

df <- data.frame(label1=letters[1:6],label2=letters[7:12])

sp <- c(-1,0,seq(0.1,0.5,0.1),seq(-2,-2.5,-0.1),seq(0.1,0.5,0.1))
sp
#     [1] -1.0  0.0  0.1  0.2  0.3  0.4  0.5 -2.0 -2.1 -2.2 -2.3 -2.4 -2.5  0.1  0.2  0.3  0.4  0.5


library(dplyr)
library(tidyr)

    expanded <- df%>%
      expand(df,sp)

> head(expanded)
  label1 label2   sp
1      a      g -2.5
2      a      g -2.4
3      a      g -2.3
4      a      g -2.2
5      a      g -2.1
6      a      g -2.0

我想根据df订单展开sp。我们怎么能这样做?

预期产出

label1 label2   sp
1       a      g -1.0
2       a      g  0.0
3       a      g  0.1
4       a      g  0.2
5       a      g  0.3
6       a      g  0.4
7       a      g  0.5
8       a      g  -2
9       a      g  -2.1
10      a      g  -2.2
11      a      g  -2.3
12      a      g  -2.4
13      a      g  -2.5
14      b      h  -1.0
15      b      h   0.0
16      b      h   0.1

等等

1 个答案:

答案 0 :(得分:1)

我们可以match列&#39; sp&#39;使用全局环境中的向量sp进行排序

r1 <- df %>%
         expand(df, sp) %>%
         arrange(label1, label2, match(sp, unique(.GlobalEnv$sp)))
dim(r1)
#[1] 78  3


identical(unique(r1$sp), unique(sp))
#[1] TRUE

更新

如果&#39; sp&#39;中有重复项。 vector我们想要expand所有值,一个选项是对vector的序列进行扩展,然后更改值

r2 <- df %>%
        expand(df, sp=seq_along(sp)) %>% 
        mutate(sp = .GlobalEnv$sp[sp])


dim(r2)
#[1] 108   3

head(r2, length(sp))
#    label1 label2   sp
# 1       a      g -1.0
# 2       a      g  0.0
# 3       a      g  0.1
# 4       a      g  0.2
# 5       a      g  0.3
# 6       a      g  0.4
# 7       a      g  0.5
# 8       a      g -2.0
# 9       a      g -2.1
# 10      a      g -2.2
# 11      a      g -2.3
# 12      a      g -2.4
# 13      a      g -2.5
# 14      a      g  0.1
# 15      a      g  0.2
# 16      a      g  0.3
# 17      a      g  0.4
# 18      a      g  0.5