我有一个如下数据框: -
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)
答案 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)