考虑以下两个小贴士:
library(tidyverse)
a <- tibble(time = c(-1, 0), value = c(100, 200))
b <- tibble(id = rep(letters[1:2], each = 3), time = rep(1:3, 2), value = 1:6)
因此a
和b
具有相同的列,而b
具有称为id的附加列。
我要执行以下操作:将b
按id
分组,然后在每个分组的顶部添加小标题a
。
因此输出应如下所示:
# A tibble: 10 x 3
id time value
<chr> <int> <int>
1 a -1 100
2 a 0 200
3 a 1 1
4 a 2 2
5 a 3 3
6 b -1 100
7 b 0 200
8 b 1 4
9 b 2 5
10 b 3 6
当然,有多种解决方法可以实现这一目标(例如,循环)。但就我而言,我有大量的ID和大量的列。 如果有人能指出我在tidyverse中解决方案的方向,我将不胜感激。
谢谢
答案 0 :(得分:2)
Dictionary<>
将基于索引将数据帧划分为子集列表。
System.Linq
答案 1 :(得分:2)
我们可以使用a
中的id
扩展数据帧b
,然后将它们bind_rows
一起扩展。
library(tidyverse)
a2 <- expand(a, id = b$id, nesting(time, value))
b2 <- bind_rows(a2, b) %>% arrange(id, time)
b2
# # A tibble: 10 x 3
# id time value
# <chr> <dbl> <dbl>
# 1 a -1 100
# 2 a 0 200
# 3 a 1 1
# 4 a 2 2
# 5 a 3 3
# 6 b -1 100
# 7 b 0 200
# 8 b 1 4
# 9 b 2 5
# 10 b 3 6
答案 2 :(得分:1)
一个想法(通过R为基础)是拆分数据框,并创建一个ID为ID +另一个数据框和rbind
的新数据框,即
df = do.call(rbind, lapply(split(b, b$id), function(i)rbind(data.frame(id = i$id[1], a), i)))
给出
id time value a.1 a -1 100 a.2 a 0 200 a.3 a 1 1 a.4 a 2 2 a.5 a 3 3 b.1 b -1 100 b.2 b 0 200 b.3 b 1 4 b.4 b 2 5 b.5 b 3 6
注意::您可以通过简单地调用rownames(df) <- NULL
答案 3 :(得分:1)
我们可以嵌套并将相关行添加到每个嵌套项目中:
library(tidyverse)
b %>%
nest(-id) %>%
mutate(data= map(data,~bind_rows(a,.x))) %>%
unnest
# # A tibble: 10 x 3
# id time value
# <chr> <dbl> <dbl>
# 1 a -1 100
# 2 a 0 200
# 3 a 1 1
# 4 a 2 2
# 5 a 3 3
# 6 b -1 100
# 7 b 0 200
# 8 b 1 4
# 9 b 2 5
# 10 b 3 6
答案 4 :(得分:0)
也许不是最有效的方法,但易于遵循:
library(tidyverse)
a <- tibble(time = c(-1, 0), value = c(100, 200))
b <- tibble(id = rep(letters[1:2], each = 3), time = rep(1:3, 2), value =
1:6)
a.a <- a %>% add_column(id = rep("a",length(a)))
a.b <- a %>% add_column(id = rep("b",length(a)))
joint <- bind_rows(b,a.a,a.b)
(joint <- arrange(joint,id))