如何在r中使用循环和rbind创建新列?

时间:2019-04-04 10:50:41

标签: r loops

我有类似的数据。我想使用循环和rbind制作3列(date1,date2,date3)。因为我只需要用那种方法来做。 (我被告知要做的是循环,对数据进行子集处理,对数据进行排序以创建新的数据帧,然后重新绑定以创建新的列。)

    year  month day  id
    2011    1   5   3101
    2011    1   14  3101
    2011    2   3   3101
    2011    2   4   3101
    2012    1   27  3153
    2012    2   20  3153
    2012    2   22  3153
    2012    3   1   3153
    2013    1   31  3103
    2013    2   1   3103
    2013    2   4   3103
    2013    3   4   3103
    2013    3   6   3103

我期望的结果是:

date1:​​从2011年1月1日开始的天数,从新一年的1开始重新开始。

date2:一年中ID工作的天数,从新一年的1开始。

date3:一年内开放的天数,从新一年的1开始重新开始。

(所有日期都按升序排列)

    year month day  id  date1 date2 date3
    2011    1   5   3101    5   1   1
    2011    1   14  3101    14  2   2
    2011    2   3   3101    34  3   3
    2011    2   4   3101    35  4   4
    2012    1   27  3153    27  1   1
    2012    2   20  3153    51  2   2
    2012    2   22  3153    53  3   3
    2012    3   1   3153    60  4   4
    2013    1   31  3103    31  1   1
    2013    2   1   3103    32  2   2
    2013    2   4   3103    35  3   3
    2013    3   4   3103    94  4   4
    2013    3   6   3103    96  5   5

请帮助!谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在不使用不必要的循环和子集的情况下做到这一点,这是下面的答案

df <- read.table(text =" year  month day  id
    2011    1   5   3101
    2011    1   14  3101
    2011    2   3   3101
    2011    2   4   3101
    2012    1   27  3153
    2012    2   20  3153
    2012    2   22  3153
    2012    3   1   3153
    2013    1   31  3103
    2013    2   1   3103
    2013    2   4   3103
    2013    3   4   3103
    2013    3   6   3103",header = T)

library(lubridate)
df$date1 <- yday(mdy(paste0(df$month,"-",df$day,"-",df$year)))
df$date2 <- ave(df$year, df$id, FUN = seq_along)

df$date3 <- ave(df$year, df$year, FUN = seq_along)