R - (Tidyverse)在时间间隔内向行数据添加行

时间:2018-06-10 15:05:52

标签: r

我一直在玩 tidyverse 而且我目前有点陷入困境。目标是以长格式获取数据框并将其转换为宽格式。这应该通过获取表示边界(下部和上部)的两个变量来完成,并创建一个新的行,其中下限已经增加1但所有其他信息都是重复的。

我一直在尝试功能的组合,但我想不出一个聪明的解决方案,我确信它存在于潮流家庭中。

创建示例数据框:(完整性的NA值)

df_example <- data.frame(l_bound = c('A00', 'B00', 'C00'), 
                         u_bound = c('A05', 'B03', NA), 
                         value = 1:3)

输出:

  l_bound u_bound value
1     A00     A05     1
2     B00     B03     2
3     C00    <NA>     3

期望的结果:

   result value
1     A00     1
2     A01     1
3     A02     1
4     A03     1
5     A04     1
6     A05     1
7     B00     2
8     B01     2
9     B02     2
10    B03     2
11    C00     3

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

以下是使用tidyverse的选项。我们使用map2来获取&#39; l_bound&#39;,&#39; u_bound&#39;的相应元素序列。在list仅在相关列之后提取数字部分(parse_number)和unnest之后的select

library(tidyverse)
library(readr)
df_example %>%
     mutate(result = map2(l_bound, u_bound, ~ 
      if(!is.na(.y)) 
        paste0(substr(.x, 1, 2), parse_number(.x):parse_number(.y)) 
      else as.character(.x))) %>% 
    select(result, value) %>% 
     unnest

或在data.table

中使用类似的方法
library(data.table)
setDT(df_example)[, if(!is.na(u_bound)).(response = paste0(substr(l_bound,
      1, 2), parse_number(l_bound):parse_number(u_bound))) 
       else as.character(l_bound), value]