【问题标题】:R - (Tidyverse) Add Rows to Dataframe Within IntervalsR - (Tidyverse)在间隔内向数据框添加行
【发布时间】:2018-06-11 00:09:40
【问题描述】:

我一直在玩 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

任何帮助将不胜感激!

【问题讨论】:

  • 哎呀对不起!我减少了 As 的数量以使示例更小。忘记复制了。

标签: r


【解决方案1】:

这是一个使用tidyverse 的选项。我们使用map2在提取数字部分(parse_number)和unnest之后仅在相关列之后得到list中的'l_bound'、'u_bound'对应元素的序列

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]

【讨论】:

  • 非常聪明!我必须将substr(.x, 1, 1) 更改为substr(.x, 1, 2),所以输出将是A00, A01, A02,...而不是A0, A1 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多