R 如何粘贴当月第一天的数据?
我有一个包含投资组合中股票权重的数据框架,它是大约1000只股票和4000天的数据。我想将每个月第一天的权重应用于该月的所有天。但是,我仍然希望保留每日数据的结构 我的数据与此类似: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包的解
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)不是真的
。当我想将结果添加到新环境时,会出现此错误。我