如何向R中的数据帧添加重复行?
我目前在R中有一个边缘列表,看起来像这样:如何向R中的数据帧添加重复行?,r,R,我目前在R中有一个边缘列表,看起来像这样: From To Start End A B 1/1/2011 1/2/2011 A F 1/1/2011 1/1/2011 B G 1/2/2011 1/2/2011 C A 1/2/2011 1/6/2011 D C 1/2/2011 1/3/2011 我想做的是在R中创建一个新的边列表,看起来像这样 From To Time A
From To Start End
A B 1/1/2011 1/2/2011
A F 1/1/2011 1/1/2011
B G 1/2/2011 1/2/2011
C A 1/2/2011 1/6/2011
D C 1/2/2011 1/3/2011
我想做的是在R中创建一个新的边列表,看起来像这样
From To Time
A B 1/1/2011
A B 1/2/2011
A F 1/1/2011
B G 1/2/2011
C A 1/2/2011
C A 1/3/2011
C A 1/4/2011
C A 1/5/2011
C A 1/6/2011
D C 1/2/2011
D C 1/3/2011
换句话说,我希望在开始日期和结束日期(包括开始日期和结束日期)之间的每一天复制第一个表中每行的前两列。这样做的好方法是什么?非常感谢你的帮助 Date类有一个
seq
函数(seq.Date
),您可以使用该函数,也可以从数据中使用IDate
。表
:
df = read.table(text = 'From To Start End
A B 1/1/2011 1/2/2011
A F 1/1/2011 1/1/2011
B G 1/2/2011 1/2/2011
C A 1/2/2011 1/6/2011
D C 1/2/2011 1/3/2011', header = T)
library(data.table)
dt = data.table(df)
dt[, cbind(.SD, seq(as.Date(Start, '%m/%d/%Y'),
as.Date(End, '%m/%d/%Y'), 1)), by = list(Start,End)]
# or
dt[, cbind(.SD, seq(as.IDate(Start, '%m/%d/%Y'),
as.IDate(End, '%m/%d/%Y'), 1)), by = list(Start,End)]
# Start End From To V2
# 1: 1/1/2011 1/2/2011 A B 2011-01-01
# 2: 1/1/2011 1/2/2011 A B 2011-01-02
# 3: 1/1/2011 1/1/2011 A F 2011-01-01
# 4: 1/2/2011 1/2/2011 B G 2011-01-02
# 5: 1/2/2011 1/6/2011 C A 2011-01-02
# 6: 1/2/2011 1/6/2011 C A 2011-01-03
# 7: 1/2/2011 1/6/2011 C A 2011-01-04
# 8: 1/2/2011 1/6/2011 C A 2011-01-05
# 9: 1/2/2011 1/6/2011 C A 2011-01-06
#10: 1/2/2011 1/3/2011 D C 2011-01-02
#11: 1/2/2011 1/3/2011 D C 2011-01-03
Date
类有一个seq
函数(seq.Date
),您可以使用该函数,也可以从数据中使用IDate
。表
:
df = read.table(text = 'From To Start End
A B 1/1/2011 1/2/2011
A F 1/1/2011 1/1/2011
B G 1/2/2011 1/2/2011
C A 1/2/2011 1/6/2011
D C 1/2/2011 1/3/2011', header = T)
library(data.table)
dt = data.table(df)
dt[, cbind(.SD, seq(as.Date(Start, '%m/%d/%Y'),
as.Date(End, '%m/%d/%Y'), 1)), by = list(Start,End)]
# or
dt[, cbind(.SD, seq(as.IDate(Start, '%m/%d/%Y'),
as.IDate(End, '%m/%d/%Y'), 1)), by = list(Start,End)]
# Start End From To V2
# 1: 1/1/2011 1/2/2011 A B 2011-01-01
# 2: 1/1/2011 1/2/2011 A B 2011-01-02
# 3: 1/1/2011 1/1/2011 A F 2011-01-01
# 4: 1/2/2011 1/2/2011 B G 2011-01-02
# 5: 1/2/2011 1/6/2011 C A 2011-01-02
# 6: 1/2/2011 1/6/2011 C A 2011-01-03
# 7: 1/2/2011 1/6/2011 C A 2011-01-04
# 8: 1/2/2011 1/6/2011 C A 2011-01-05
# 9: 1/2/2011 1/6/2011 C A 2011-01-06
#10: 1/2/2011 1/3/2011 D C 2011-01-02
#11: 1/2/2011 1/3/2011 D C 2011-01-03
数据来自哪里?你在编吗?这里的数据只是我编的一个例子;实际文件太大,无法包含在此。您可以始终包含数据样本,例如,使用
dput(head(df))
。您还应该根据您对第一个答案的评论更新您的问题,因为您想要的内容在问题中没有得到很好的解释。谢谢您的建议!数据来自哪里?你在编吗?这里的数据只是我编的一个例子;实际文件太大,无法包含在此。您可以始终包含数据样本,例如,使用dput(head(df))
。您还应该根据您对第一个答案的评论更新您的问题,因为您想要的内容在问题中没有得到很好的解释。谢谢您的建议!要避免使用.SD
,请使用类似于dt[,list(Time=seq(from=as.Date(Start,format='%m/%d/%Y'),to=as.Date(End,format='%m/%d/%Y'),by='day')),by='from,to'.
@mnel:非常感谢!在我的实际数据中,当我使用您在上面发布的代码时,我得到一个错误,指出“from必须为长度1”。你知道我为什么会犯这样的错误吗?抱歉,没有将实际数据发布到网上-我不允许共享it@eddi非常感谢。这在样本数据上非常有效,但当我应用于实际数据时,我得到了以下错误“数据中的错误。表(…,key=key(…1)):参数2(nrow 2)不能循环使用,没有余数来匹配最长的nrow(3)”您知道为什么会出现此错误吗?非常感谢@overflowname如果您有重复的Start
/End
,请尝试对所有列执行“by”(在这种情况下,您不需要cbind
.SD
,原因与@mnel的答案相同):dt[,seq(as.IDate(Start),%m/%d/%Y'),as.IDate(End),%m/%d/%Y'),1),by=列表(From,to,Start,End)]
-如果您仍然收到该错误,这意味着您的数据中有重复的行,应该将其过滤掉。要避免使用.SD
,请使用类似dt[,list(Time=seq(from=as.Date(Start,format='%m/%d/%Y'),to=as.Date(End,format='%m/%d/%Y'),by='day')),by='from,to']
@mnel:非常感谢!在我的实际数据中,当我使用您在上面发布的代码时,我得到一个错误,指出“from必须为长度1”。你知道我为什么会犯这样的错误吗?抱歉,没有将实际数据发布到网上-我不允许共享it@eddi非常感谢。这在样本数据上非常有效,但当我应用于实际数据时,我得到了以下错误“数据中的错误。表(…,key=key(…1)):参数2(nrow 2)不能循环使用,没有余数来匹配最长的nrow(3)”您知道为什么会出现此错误吗?非常感谢@overflowname如果您有重复的Start
/End
,请尝试对所有列执行“by”(在这种情况下,您不需要cbind
.SD
,原因与@mnel的答案相同):dt[,seq(as.IDate(Start),%m/%d/%Y'),as.IDate(End),%m/%d/%Y'),1),by=列表(From,to,Start,End)]
-如果仍然出现该错误,则表示数据中存在重复行,应将其过滤掉。