R 用干涉观测扩展数据框
我试图在R中扩展一个数据框,其中缺少的观测值不是很明显。我的意思是:R 用干涉观测扩展数据框,r,dataframe,dplyr,R,Dataframe,Dplyr,我试图在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个,一年是开始和结束之间的一个值(包括)。因此: 据我所知,expand的各种版本只处理唯一值,但在这里,我的数据帧并没有所
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个,一年是开始和结束之间的一个值(包括)。因此:
据我所知,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
library(tidyr)
图书馆(dplyr)
df%>%
聚集(键=键,值=年,-id)%>%
选择(-key)%%>%
分组依据(id)%>%
完整(年份=完整(年份,1))
#一个tibble:8x2
#组别:id[2]
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年
您可以使用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
library(tidyr)
图书馆(dplyr)
df%>%
聚集(键=键,值=年,-id)%>%
选择(-key)%%>%
分组依据(id)%>%
完整(年份=完整(年份,1))
#一个tibble:8x2
#组别:id[2]
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年
使用dplyr
和tidyr
,我创建了一个包含年份列表的新列,然后取消数据框的测试
library(tidyr)
library(dplyr)
df <-
data.frame(
id = c("a", "b"),
start = c(2002, 2004),
end = c(2005, 2007)
)
df %>%
rowwise() %>%
mutate(year = list(seq(start, end))) %>%
select(-start, -end) %>%
unnest()
library(tidyr)
图书馆(dplyr)
df%
行()
突变(年份=列表(顺序(开始、结束))%>%
选择(-start,-end)%>%
unnest()
输出
# A tibble: 8 x 2
id year
<fct> <int>
1 a 2002
2 a 2003
3 a 2004
4 a 2005
5 b 2004
6 b 2005
7 b 2006
8 b 2007
#一个tible:8 x 2
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年
使用dplyr
和tidyr
,我创建了一个包含年份列表的新列,然后取消数据框的测试
library(tidyr)
library(dplyr)
df <-
data.frame(
id = c("a", "b"),
start = c(2002, 2004),
end = c(2005, 2007)
)
df %>%
rowwise() %>%
mutate(year = list(seq(start, end))) %>%
select(-start, -end) %>%
unnest()
library(tidyr)
图书馆(dplyr)
df%
行()
突变(年份=列表(顺序(开始、结束))%>%
选择(-start,-end)%>%
unnest()
输出
# A tibble: 8 x 2
id year
<fct> <int>
1 a 2002
2 a 2003
3 a 2004
4 a 2005
5 b 2004
6 b 2005
7 b 2006
8 b 2007
#一个tible:8 x 2
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年
一个使用数据的简单解决方案。表
:
library(data.table)
# option 1
setDT(df)[, .(year = seq(start, end)), by = id]
# option 2
setDT(df)[, .(year = start:end), by = id]
其中:
基于R的方法:
lst <- Map(seq, df$start, df$end)
data.frame(id = rep(df$id, lengths(lst)), year = unlist(lst))
lst使用数据的简单解决方案。表
:
library(data.table)
# option 1
setDT(df)[, .(year = seq(start, end)), by = id]
# option 2
setDT(df)[, .(year = start:end), by = id]
其中:
基于R的方法:
lst <- Map(seq, df$start, df$end)
data.frame(id = rep(df$id, lengths(lst)), year = unlist(lst))
l谢谢!这很有效。。。但是如果我想把其他变量复制到这些中间的观察结果中,就失败了,不仅仅是id。可以用这段代码完成,但是@Jack Brookes的输入更少。这一切都取决于你想对中间几年的数值做什么。@p不管数据如何。
-我发布的解决方案甚至更少键入;-)谢谢这很有效。。。但是如果我想把其他变量复制到这些中间的观察结果中,就失败了,不仅仅是id。可以用这段代码完成,但是@Jack Brookes的输入更少。这一切都取决于你想对中间几年的数值做什么。@p不管数据如何。
-我发布的解决方案甚至更少键入;-)谢谢这管用!添加其他变量很容易;它们会自动复制过来,这正是我想要的。谢谢!这管用!添加其他变量很容易;它们会自动复制过来,这正是我想要的。