bind_rows到每个小标题

时间:2018-07-11 13:05:38

标签: r tidyverse

考虑以下两个小贴士

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)

因此ab具有相同的列,而b具有称为id的附加列。 我要执行以下操作:将bid分组,然后在每个分组的顶部添加小标题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中解决方案的方向,我将不胜感激。

谢谢

5 个答案:

答案 0 :(得分:2)

来自基数R的

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))