Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向R中的数据帧添加重复行?_R - Fatal编程技术网

如何向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

我目前在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     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)]
-如果仍然出现该错误,则表示数据中存在重复行,应将其过滤掉。