如何向 R 中的每个不同观察添加一组行
How can I add a set of rows to each distinct observation in R
我希望在 R 中自动化一个以前手工完成的过程,而且非常耗时。我想将一个数据框中的一系列观察结果添加到另一个数据框中的每个唯一变量。使用数据的示例可能会更好地说明这一点...
Table 其中包含对每种动物的大量观察,这是 table 我想为每种动物添加一组行的地方。
Animal
Colour
Temperament
Cat
Black
Calm
Dog
Beige
Anxious
Cat
White
Playful
Table 二显示应应用于每只动物的行。
Colour
Temperament
Brown
Control
Beige
Control
White
Control
最后的 table 应该类似于:
Animal
Colour
Temperament
Cat
Black
Calm
Dog
Beige
Anxious
Cat
White
Playful
Cat
Brown
Control
Cat
Beige
Control
Cat
White
Control
Dog
Brown
Control
Dog
Beige
Control
Dog
White
Control
有人能给我指出正确的方向吗? Pref 在基础 R 上使用 tidyverse(但不是必需的 :))
1.We 创建易于使用且可重现的示例数据
d1 <- data.frame(an = c("c", "d", "c"),
cl = c("bl", "be", "wh"),
tm = c("cl", "an", "pl"))
d2 <- data.frame(cl = c("br", "be", "wh"),
tm = "cn")
2.Using expand_grid
结合 tidyr::full_join
将 data.frame d1
扩展为所需的形式:
library(dplyr)
library(tidyr)
d1 %>%
full_join(expand_grid(d2, an = unique(d1$an)))
这个returns:
an cl tm
1 c bl cl
2 d be an
3 c wh pl
4 c br cn
5 d br cn
6 c be cn
7 d be cn
8 c wh cn
9 d wh cn
使用crossing
library(dplyr)
library(tidyr)
crossing(d2, an = d1$an) %>%
full_join(d1)
Joining, by = c("cl", "tm", "an")
# A tibble: 9 × 3
cl tm an
<chr> <chr> <chr>
1 be cn c
2 be cn d
3 br cn c
4 br cn d
5 wh cn c
6 wh cn d
7 bl cl c
8 be an d
9 wh pl c
数据
d1 <- structure(list(an = c("c", "d", "c"), cl = c("bl", "be", "wh"
), tm = c("cl", "an", "pl")), class = "data.frame", row.names = c(NA,
-3L))
d2 <- structure(list(cl = c("br", "be", "wh"), tm = c("cn", "cn", "cn"
)), class = "data.frame", row.names = c(NA, -3L))
我希望在 R 中自动化一个以前手工完成的过程,而且非常耗时。我想将一个数据框中的一系列观察结果添加到另一个数据框中的每个唯一变量。使用数据的示例可能会更好地说明这一点...
Table 其中包含对每种动物的大量观察,这是 table 我想为每种动物添加一组行的地方。
Animal | Colour | Temperament |
---|---|---|
Cat | Black | Calm |
Dog | Beige | Anxious |
Cat | White | Playful |
Table 二显示应应用于每只动物的行。
Colour | Temperament |
---|---|
Brown | Control |
Beige | Control |
White | Control |
最后的 table 应该类似于:
Animal | Colour | Temperament |
---|---|---|
Cat | Black | Calm |
Dog | Beige | Anxious |
Cat | White | Playful |
Cat | Brown | Control |
Cat | Beige | Control |
Cat | White | Control |
Dog | Brown | Control |
Dog | Beige | Control |
Dog | White | Control |
有人能给我指出正确的方向吗? Pref 在基础 R 上使用 tidyverse(但不是必需的 :))
1.We 创建易于使用且可重现的示例数据
d1 <- data.frame(an = c("c", "d", "c"),
cl = c("bl", "be", "wh"),
tm = c("cl", "an", "pl"))
d2 <- data.frame(cl = c("br", "be", "wh"),
tm = "cn")
2.Using expand_grid
结合 tidyr::full_join
将 data.frame d1
扩展为所需的形式:
library(dplyr)
library(tidyr)
d1 %>%
full_join(expand_grid(d2, an = unique(d1$an)))
这个returns:
an cl tm 1 c bl cl 2 d be an 3 c wh pl 4 c br cn 5 d br cn 6 c be cn 7 d be cn 8 c wh cn 9 d wh cn
使用crossing
library(dplyr)
library(tidyr)
crossing(d2, an = d1$an) %>%
full_join(d1)
Joining, by = c("cl", "tm", "an")
# A tibble: 9 × 3
cl tm an
<chr> <chr> <chr>
1 be cn c
2 be cn d
3 br cn c
4 br cn d
5 wh cn c
6 wh cn d
7 bl cl c
8 be an d
9 wh pl c
数据
d1 <- structure(list(an = c("c", "d", "c"), cl = c("bl", "be", "wh"
), tm = c("cl", "an", "pl")), class = "data.frame", row.names = c(NA,
-3L))
d2 <- structure(list(cl = c("br", "be", "wh"), tm = c("cn", "cn", "cn"
)), class = "data.frame", row.names = c(NA, -3L))