使用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,这就是发生的情况。请参阅我的第二次编辑。我只是把每件事都当作一种性格。如果需要,您可以稍后将其更改为日期。