在R中展开数据框

时间:2018-05-04 21:11:23

标签: r dplyr tidyverse

我有一个如下数据框: -

                            Var1                  Var2
    1                        a                     a
    2                        a                     b
    3                        b                     a
    4                        b                     b

我想要一个包含值1和2的ID列。如何展开上面的数据框以使最终数据框看起来像这样?

                            Var1                  Var2  ID
    1                        a                     a     1
    2                        a                     b     1
    3                        b                     a     1
    4                        b                     b     2
    1                        a                     a     2
    2                        a                     b     2
    3                        b                     a     2
    4                        b                     b     2

啊,多亏了MKR,问题归咎于包裹。

      library(dplyr)

df <- read.table(text = 
                   "Var1                  Var2
                 1                        a                     a
                 2                        a                     b
                 3                        b                     a
                 4                        b                     b",
                 header = TRUE, stringsAsFactors = FALSE)



df %>% group_by(Var1, Var2) %>% expand(ID = 1:2) %>%
  arrange(ID)

3 个答案:

答案 0 :(得分:1)

有许多选项可用于获得所需的结果。但也许OP似乎热衷于使用tidyr::expand。解决方案可以是:

library(dplyr)
library(tidyr)

df %>% group_by(Var1, Var2) %>% expand(ID = 1:2) %>%
  arrange(ID)

# # A tibble: 8 x 3
# # Groups: Var1, Var2 [4]
#   Var1  Var2     ID
#   <chr> <chr> <int>
# 1 a     a         1
# 2 a     b         1
# 3 b     a         1
# 4 b     b         1
# 5 a     a         2
# 6 a     b         2
# 7 b     a         2
# 8 b     b         2

数据:

df <- read.table(text = 
"Var1                  Var2
  1                        a                     a
  2                        a                     b
  3                        b                     a
  4                        b                     b",
header = TRUE, stringsAsFactors = FALSE)

答案 1 :(得分:0)

这里有一些非常普遍的东西:

library(dplyr)

x <- head(cars,2)
bind_rows(replicate(3,x,simplify = FALSE),.id="ID")
#   ID speed dist
# 1  1     4    2
# 2  1     4   10
# 3  2     4    2
# 4  2     4   10
# 5  3     4    2
# 6  3     4   10

答案 2 :(得分:0)

tidyr::expand 对我不起作用。然而,tidyr::crossing 的作用就像一个魅力。

使用 crossing 的解决方案是:

library(tidyr)
library(dplyr)

df %>% crossing(ID = c(1:2)) %>% arrange(ID)

# # A tibble: 8 x 3
#   Var1  Var2     ID
#   <chr> <chr> <int>
# 1 a     a         1
# 2 a     b         1
# 3 b     a         1
# 4 b     b         1
# 5 a     a         2
# 6 a     b         2
# 7 b     a         2
# 8 b     b         2

数据(感谢从 MKR <3 复制):

df <- read.table(text = 
"Var1                  Var2
  1                        a                     a
  2                        a                     b
  3                        b                     a
  4                        b                     b",
header = TRUE, stringsAsFactors = FALSE)