我一直在玩 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
任何帮助将不胜感激!
答案 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]