Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date_Copy - Fatal编程技术网

R 如何粘贴当月第一天的数据?

R 如何粘贴当月第一天的数据?,r,date,copy,R,Date,Copy,我有一个包含投资组合中股票权重的数据框架,它是大约1000只股票和4000天的数据。我想将每个月第一天的权重应用于该月的所有天。但是,我仍然希望保留每日数据的结构 我的数据与此类似: data <- as.data.frame(matrix(1:4000, nrow = 200, ncol = 20)) rownames(data) <- seq(as.Date("2018/01/01"), as.Date("2018/07/19"), 1) data这里有一个使用dplyr包的解

我有一个包含投资组合中股票权重的数据框架,它是大约1000只股票和4000天的数据。我想将每个月第一天的权重应用于该月的所有天。但是,我仍然希望保留每日数据的结构

我的数据与此类似:

data <- as.data.frame(matrix(1:4000, nrow = 200, ncol = 20))
rownames(data) <- seq(as.Date("2018/01/01"), as.Date("2018/07/19"), 1)

data这里有一个使用
dplyr
包的解决方案

library(dplyr)

library(zoo)

# convert row names to variable
tibble::rownames_to_column(data, "Date") -> data

# add first value of month to all rows
data %>% 
  mutate(yearmon=zoo::as.yearmon(Date)) %>% #select years-months
  group_by(yearmon) %>% #group by them
  mutate(first=first(V1)) -> data_new #add value

下面是一个使用
dplyr
包的解决方案

library(dplyr)

library(zoo)

# convert row names to variable
tibble::rownames_to_column(data, "Date") -> data

# add first value of month to all rows
data %>% 
  mutate(yearmon=zoo::as.yearmon(Date)) %>% #select years-months
  group_by(yearmon) %>% #group by them
  mutate(first=first(V1)) -> data_new #add value

一种选择是:

  • 使用
    lubridate
    识别不在第一个月的行,并将其值设置为NA
  • 使用
    zoo
    package forward使用
    na.locf
  • 像这样:

    library(lubridate)
    library(zoo)
    data[day(row.names(data)) != 1, ] = NA
    data = na.locf(data)
    

    一种选择是:

  • 使用
    lubridate
    识别不在第一个月的行,并将其值设置为NA
  • 使用
    zoo
    package forward使用
    na.locf
  • 像这样:

    library(lubridate)
    library(zoo)
    data[day(row.names(data)) != 1, ] = NA
    data = na.locf(data)
    

    您可能希望在
    处使用分组的
    dplyr::mutate\u:

    library(dplyr)
    
    data %>%
      rownames_to_column("Date") %>%
      mutate(Month = format(as.Date(Date), "%Y-%m")) %>%
      group_by(Month) %>%
      mutate_at(vars(starts_with("V")), .funs = list(weight = ~first(.))) %>%
      column_to_rownames("Date") %>%
      select(Month, starts_with("V"))
    
    输出

    #              Month V1  V2  V3  V4  V5   V6   V7   V8   V9  V10  V11  V12  V13  V14  V15  V16  V17  V18  V19  V20 V1_weight
    # 2018-01-01 2018-01  1 201 401 601 801 1001 1201 1401 1601 1801 2001 2201 2401 2601 2801 3001 3201 3401 3601 3801         1
    # 2018-01-02 2018-01  2 202 402 602 802 1002 1202 1402 1602 1802 2002 2202 2402 2602 2802 3002 3202 3402 3602 3802         1
    # 2018-01-03 2018-01  3 203 403 603 803 1003 1203 1403 1603 1803 2003 2203 2403 2603 2803 3003 3203 3403 3603 3803         1
    # 2018-01-04 2018-01  4 204 404 604 804 1004 1204 1404 1604 1804 2004 2204 2404 2604 2804 3004 3204 3404 3604 3804         1
    # ...
    # 2018-01-21 2018-01 21 221 421 621 821 1021 1221 1421 1621 1821 2021 2221 2421 2621 2821 3021 3221 3421 3621 3821         1
    # 2018-01-22 2018-01 22 222 422 622 822 1022 1222 1422 1622 1822 2022 2222 2422 2622 2822 3022 3222 3422 3622 3822         1
    # 2018-01-23 2018-01 23 223 423 623 823 1023 1223 1423 1623 1823 2023 2223 2423 2623 2823 3023 3223 3423 3623 3823         1
    # 2018-01-24 2018-01 24 224 424 624 824 1024 1224 1424 1624 1824 2024 2224 2424 2624 2824 3024 3224 3424 3624 3824         1
    #            V2_weight V3_weight V4_weight V5_weight V6_weight V7_weight V8_weight V9_weight V10_weight V11_weight V12_weight
    # 2018-01-01       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-02       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-03       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-04       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # ...
    # 2018-01-21       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-22       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-23       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-24       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    #            V13_weight V14_weight V15_weight V16_weight V17_weight V18_weight V19_weight V20_weight
    # 2018-01-01       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-02       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-03       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-04       2401       2601       2801       3001       3201       3401       3601       3801
    # ...
    # 2018-01-20       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-21       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-22       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-23       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-24       2401       2601       2801       3001       3201       3401       3601       3801
    

    您可能希望在
    处使用分组的
    dplyr::mutate\u:

    library(dplyr)
    
    data %>%
      rownames_to_column("Date") %>%
      mutate(Month = format(as.Date(Date), "%Y-%m")) %>%
      group_by(Month) %>%
      mutate_at(vars(starts_with("V")), .funs = list(weight = ~first(.))) %>%
      column_to_rownames("Date") %>%
      select(Month, starts_with("V"))
    
    输出

    #              Month V1  V2  V3  V4  V5   V6   V7   V8   V9  V10  V11  V12  V13  V14  V15  V16  V17  V18  V19  V20 V1_weight
    # 2018-01-01 2018-01  1 201 401 601 801 1001 1201 1401 1601 1801 2001 2201 2401 2601 2801 3001 3201 3401 3601 3801         1
    # 2018-01-02 2018-01  2 202 402 602 802 1002 1202 1402 1602 1802 2002 2202 2402 2602 2802 3002 3202 3402 3602 3802         1
    # 2018-01-03 2018-01  3 203 403 603 803 1003 1203 1403 1603 1803 2003 2203 2403 2603 2803 3003 3203 3403 3603 3803         1
    # 2018-01-04 2018-01  4 204 404 604 804 1004 1204 1404 1604 1804 2004 2204 2404 2604 2804 3004 3204 3404 3604 3804         1
    # ...
    # 2018-01-21 2018-01 21 221 421 621 821 1021 1221 1421 1621 1821 2021 2221 2421 2621 2821 3021 3221 3421 3621 3821         1
    # 2018-01-22 2018-01 22 222 422 622 822 1022 1222 1422 1622 1822 2022 2222 2422 2622 2822 3022 3222 3422 3622 3822         1
    # 2018-01-23 2018-01 23 223 423 623 823 1023 1223 1423 1623 1823 2023 2223 2423 2623 2823 3023 3223 3423 3623 3823         1
    # 2018-01-24 2018-01 24 224 424 624 824 1024 1224 1424 1624 1824 2024 2224 2424 2624 2824 3024 3224 3424 3624 3824         1
    #            V2_weight V3_weight V4_weight V5_weight V6_weight V7_weight V8_weight V9_weight V10_weight V11_weight V12_weight
    # 2018-01-01       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-02       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-03       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-04       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # ...
    # 2018-01-21       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-22       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-23       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    # 2018-01-24       201       401       601       801      1001      1201      1401      1601       1801       2001       2201
    #            V13_weight V14_weight V15_weight V16_weight V17_weight V18_weight V19_weight V20_weight
    # 2018-01-01       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-02       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-03       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-04       2401       2601       2801       3001       3201       3401       3601       3801
    # ...
    # 2018-01-20       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-21       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-22       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-23       2401       2601       2801       3001       3201       3401       3601       3801
    # 2018-01-24       2401       2601       2801       3001       3201       3401       3601       3801
    

    谢谢!非常快速和简单的解决方案!行!我只是遇到了一个小问题,我的几个月不是从第一天开始的。有没有一个快速的方法来改变这个问题=1参数是否包含此项?您可以使用
    month
    函数检查您得到的月份是否与前一行相同,而不是检查日期是否不相等1。非常感谢!非常快速和简单的解决方案!行!我只是遇到了一个小问题,我的几个月不是从第一天开始的。有没有一个快速的方法来改变这个问题=1个参数来包含此参数?您可以使用
    month
    函数检查您得到的月份是否与前一行相同,而不是检查日期是否不相等。我成功地做到了这一点,但现在我尝试重复它,我不断得到以下错误:
    rownames\u to\u列(“日期”)中的错误:is.data.frame(df)不正确
    。当我想将结果添加到新环境时,会出现此错误。我设法做到了,但现在我尝试重复它,我不断得到以下错误:
    rownames\u to\u列(“日期”)中的错误:is.data.frame(df)不是真的
    。当我想将结果添加到新环境时,会出现此错误。我