使用seq_along()处理for循环中的日期

使用seq_along()处理for循环中的日期,r,date,for-loop,numeric,R,Date,For Loop,Numeric,以下是示例数据的两个dfs: df1 ID First.seen Last.seen A10 2015-09-07 2015-09-16 A11 2015-09-07 2015-09-19 df2 ID First_seen Last_seen A1 2015-09-07 0 A10 2015-09-07 0 如果ID在dfs和dfs中都很常见,我想填写df2$Last\u seen。请注意,在实际数据中

以下是示例数据的两个
df
s:

df1

ID      First.seen  Last.seen 
A10   2015-09-07  2015-09-16       
A11   2015-09-07  2015-09-19 



df2
 ID      First_seen  Last_seen
 A1      2015-09-07  0
A10      2015-09-07  0
如果
ID
dfs
dfs中都很常见,我想填写
df2$Last\u seen
。请注意,在实际数据中,我在两个dfs中都有几个ID。我尝试了
for
循环,但只得到了数值:

for (i in 1:nrow(df2)){
  if (df2$ID[i] %in% df1$ID) {
    df2$Last_seen[i] <- df1$Last.seen[df1$ID == df2$ID[i]]
  }else{
    df2$Last_seen[i] <- 0
  }
}

关于如何正确使用它有什么建议吗?

这样做不需要循环。您需要连接ID上的表。这可以通过
dplyr
完成:

df1 <- read.table(text="ID      First.seen  Last.seen
A10   2015-09-07  2015-09-16
A11   2015-09-07  2015-09-19",header=TRUE, stringsAsFactors=FALSE)

df2<- read.table(text="ID      First_seen  Last_seen
 A1      2015-09-07  0
A10      2015-09-07  0",header=TRUE, stringsAsFactors=FALSE)

library(dplyr)
left_join(df2,df1)
   ID First_seen Last_seen First.seen  Last.seen
1  A1 2015-09-07         0       <NA>       <NA>
2 A10 2015-09-07         0 2015-09-07 2015-09-16
编辑要更改最后一次看到的是0的地方,您可以在其他
情况下添加广告:

left_join(df2,df1, by=c("ID" = "ID","First_seen"="First.seen")) %>%
mutate(Last_seen=ifelse(is.na(Last.seen),Last_seen,Last.seen),
       Last_seen=ifelse(Last_seen==0,format(as.Date(First_seen)+16,"%Y-%m-%d"),Last.seen))%>%
select(-Last.seen)

   ID First_seen  Last_seen
1  A1 2015-09-07 2015-09-23
2 A10 2015-09-07 2015-09-16
EDIT2

left_join(df2,df1, by=c("ID" = "ID","First_seen"="First.seen")) %>%
mutate(Last_seen=ifelse(is.na(Last.seen),Last_seen,Last.seen),
       Last_seen=ifelse(Last_seen==0,format(as.Date(First_seen)+16,"%Y-%m-%d",origin = "1900-01-01"),Last.seen))%>%
select(-Last.seen)

   ID First_seen  Last_seen
1  A1 2015-09-07 2015-09-23
2 A10 2015-09-07 2015-09-16

这样做不需要循环。您需要连接ID上的表。这可以通过
dplyr
完成:

df1 <- read.table(text="ID      First.seen  Last.seen
A10   2015-09-07  2015-09-16
A11   2015-09-07  2015-09-19",header=TRUE, stringsAsFactors=FALSE)

df2<- read.table(text="ID      First_seen  Last_seen
 A1      2015-09-07  0
A10      2015-09-07  0",header=TRUE, stringsAsFactors=FALSE)

library(dplyr)
left_join(df2,df1)
   ID First_seen Last_seen First.seen  Last.seen
1  A1 2015-09-07         0       <NA>       <NA>
2 A10 2015-09-07         0 2015-09-07 2015-09-16
编辑要更改最后一次看到的是0的地方,您可以在其他情况下添加广告:

left_join(df2,df1, by=c("ID" = "ID","First_seen"="First.seen")) %>%
mutate(Last_seen=ifelse(is.na(Last.seen),Last_seen,Last.seen),
       Last_seen=ifelse(Last_seen==0,format(as.Date(First_seen)+16,"%Y-%m-%d"),Last.seen))%>%
select(-Last.seen)

   ID First_seen  Last_seen
1  A1 2015-09-07 2015-09-23
2 A10 2015-09-07 2015-09-16
EDIT2

left_join(df2,df1, by=c("ID" = "ID","First_seen"="First.seen")) %>%
mutate(Last_seen=ifelse(is.na(Last.seen),Last_seen,Last.seen),
       Last_seen=ifelse(Last_seen==0,format(as.Date(First_seen)+16,"%Y-%m-%d",origin = "1900-01-01"),Last.seen))%>%
select(-Last.seen)

   ID First_seen  Last_seen
1  A1 2015-09-07 2015-09-23
2 A10 2015-09-07 2015-09-16

太棒了,很有道理。如果我想将结果
df
Last\u-seed
列中的
0
值更改为
First\u-seed+16天的值,我只是使用我的全部数据测试了“三列表”解决方案,然后再次得到数值,而不是日期。有什么想法吗?@Bonono如果你用left_join创建的对象。。。是df1,一切结束后再做:
df1$Last\u上次我遇到了这个问题-它只是将数值转换为
NA
sYes,这就是发生的情况。请参阅我的第二次编辑。我只是把每件事都当作一种性格。如果你想的话,你可以把它改成最新的。太棒了,很有意义。如果我想将结果
df
Last\u-seed
列中的
0
值更改为
First\u-seed+16天的值,我只是使用我的全部数据测试了“三列表”解决方案,然后再次得到数值,而不是日期。有什么想法吗?@Bonono如果你用left_join创建的对象。。。是df1,一切结束后再做:
df1$Last\u上次我遇到了这个问题-它只是将数值转换为
NA
sYes,这就是发生的情况。请参阅我的第二次编辑。我只是把每件事都当作一种性格。如果需要,您可以稍后将其更改为日期。