r - 使用干预观察扩展数据框
问题描述
我正在尝试扩展 R 中的数据框,其中缺少并非立即显而易见的观察结果。这就是我的意思:
data.frame(id = c("a","b"),start = c(2002,2004), end = c(2005,2007))
这是:
id start end
1 a 2002 2005
2 b 2004 2007
我想要的是一个新的数据框,总共有 8 个观察值,“a”和“b”各 4 个,并且一年是开始和结束(包括)之间的值之一。所以:
id year
a 2002
a 2003
a 2004
a 2005
b 2004
b 2005
b 2006
b 2007
据我了解,各种版本的 expand 仅适用于唯一值,但在这里我的数据框没有所有唯一值(明确)。
我正在考虑逐步遍历每一行,然后使用 sapply() 生成一个数据框,然后将所有新数据框连接在一起。但是这种尝试失败了:
sapply(test,function(x) { data.frame( id=rep(id,x[["end"]]-x[["start"]]), year = x[["start"]]:x[["end"]] )})
我知道必须有一些 dplyr 或其他魔法来解决这个问题!
解决方案
你可以使用tidyr
和dplyr
library(tidyr)
library(dplyr)
df %>%
gather(key = key, value = year, -id) %>%
select(-key) %>%
group_by(id) %>%
complete(year = full_seq(year,1))
# A tibble: 8 x 2
# Groups: id [2]
id year
<fct> <dbl>
1 a 2002
2 a 2003
3 a 2004
4 a 2005
5 b 2004
6 b 2005
7 b 2006
8 b 2007
推荐阅读
- c++ - 在编译阶段无法访问 lua 模块中的新结构
- flutter - 如何在 Firefox 上显示 svg 文件?
- android - 移动时如何保持当前位置点在地图中心?
- javascript - 创建本地主机服务器时如何克服此错误?
- concurrency - 如何在 PyQt 中将多个信号组合成一个复合槽?
- perl - Perl::Critic in Brutal Mode
- java - 输入:123 -123 输出:0 线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:
- ssl - 使用 Surge 将站点部署到自定义域后出现“SSL_ERROR_BAD_CERT_DOMAIN”错误
- typescript - Vue子组件未根据计算函数呈现
- javascript - 这个工厂有更好的实现吗?