R根据原始行追加新行
R append new rows based on original rows
我是 R 的新手,我想在原始行的基础上添加很多新行。
首先,我展示我的部分数据:
Type Time PM
Ac 2016-01 7710
Ac 2016-02 27500
Ac 2016-03 12840
Ac 2016-04 20060
Ac 2016-05 9430
Ac 2016-06 9830
Ac 2016-07 3870
Ac 2016-08 12040
Ac 2016-09 5590
Ac 2016-10 4300
Ac 2016-11 3870
Ac 2016-12 2580
As 2016-01 315052
As 2016-02 478542
As 2016-03 491472
As 2016-04 662238
As 2016-05 464728
As 2016-06 530424
As 2016-07 443122
As 2016-08 603512
As 2016-09 564438
As 2016-10 440068
As 2016-11 462846
As 2016-12 525394
HW 2015-12 7250
其次,我想要的是如下(我以Type Ac
、Time 2016-01 & 2016-03 & 2016-10
为例):
Type Time Time2 LapseMonth PM What I want
Ac 2016-01 2016-01 0 7710 315.9836066
Ac 2016-01 2016-02 1 0 610.9016393
Ac 2016-01 2016-03 2 0 653.0327869
Ac 2016-01 2016-04 3 0 631.9672131
Ac 2016-01 2016-05 4 0 653.0327869
Ac 2016-01 2016-06 5 0 631.9672131
Ac 2016-01 2016-07 6 0 653.0327869
Ac 2016-01 2016-08 7 0 653.0327869
Ac 2016-01 2016-09 8 0 631.9672131
Ac 2016-01 2016-10 9 0 653.0327869
Ac 2016-01 2016-11 10 0 631.9672131
Ac 2016-01 2016-12 11 0 653.0327869
Ac 2016-03 2016-03 0 12840 526.2295082
Ac 2016-03 2016-04 1 0 1052.459016
Ac 2016-03 2016-05 2 0 1087.540984
Ac 2016-03 2016-06 3 0 1052.459016
Ac 2016-03 2016-07 4 0 1087.541
Ac 2016-03 2016-08 5 0 1087.541
Ac 2016-03 2016-09 6 0 1052.459
Ac 2016-03 2016-10 7 0 1087.541
Ac 2016-03 2016-11 8 0 1052.459
Ac 2016-03 2016-12 9 0 1087.541
Ac 2016-10 2016-10 0 4300 176.2295082
Ac 2016-10 2016-11 1 0 352.4590164
Ac 2016-10 2016-12 2 0 364.2076503
我说明我要的结果:
1. Time2
是一个新列,等于 Time
.
之后的月份
2. LapseMonth
也是一个新列,等于月(Time2
) - 月(Time
)。因此,它生成如上。
3. 列What I want
很复杂。
查看 row1(Time
:2016-01, Time2
:2016-01, LapseMonth
:0, PM
:7710, What I want
:315.9836066)
当Time
= Time1
时,What I want
的公式为15/366*PM,即PM=7710
而下面是那个月的日/366*PM(即row2:610.9016393 = 29/366*7710,riow3:653.0327869 = 31/366 *7710)
我是逐行添加的,但是很多的时候效率很低type
。
我想也许我可以使用 for-loop
或 ifelse
来弄清楚。但是,我仍然没有开始的想法。
我在下面添加我的代码。由于我的数据包含多个excel,所以我一次性读取:
library(readxl)
library(data.table)
library(lubridate)
file.list <- dir(path = "filename", pattern='\.xlsx', full.names = T)
df.list <- lapply(file.list, read_excel)
df <- rbindlist(df.list)
df<-as.data.table(df)
df[,Time:=as.Date(Time,"%Y-%m")]
Time
格式更改为日期,但值全部丢失。这是怎么回事? [已解决]
df$Time <- ymd( paste( df$Time, 01, sep = "-"))
然后查看@Erdem Akkas 的回答和 运行 代码。
有些东西很特别。
看看我最后的观察结果。数据:HW 2015-12 7250
当Time
为2015时,我需要的结果与Time
in 2016.
不同
我想要的是:
Type Time Time2 LapseMonth PM What I want
HW 2015-12 2015-12 0 7250 297.1311475
HW 2015-12 2016-01 1 0 614.0710382
HW 2015-12 2016-02 2 0 574.4535519
HW 2015-12 2016-03 3 0 614.0710382
HW 2015-12 2016-04 4 0 594.2622951
HW 2015-12 2016-05 5 0 614.0710382
HW 2015-12 2016-06 6 0 594.2622951
HW 2015-12 2016-07 7 0 614.0710382
HW 2015-12 2016-08 8 0 614.0710382
HW 2015-12 2016-09 9 0 594.2622951
HW 2015-12 2016-10 10 0 614.0710382
HW 2015-12 2016-11 11 0 594.2622951
HW 2015-12 2016-12 12 0 316.9398907
以上是2015年Time
的时候,What I want
我确实需要
我知道它很复杂,所以我在下面解释一下。
1、当Time
是2015时,无论什么月份,LapseMonth
都不一样当Time
是2016。 2015 年 Time
时 LapseMonth
必须有 0~12。(见上文)
2.列What I want
与2016年Time
时计算相同,但有一个特例。当LapseMonth
等于12时,What I want
的值为原值减去LapseMonth
=0时What I want
的值。这里很奇怪。
本例中的原值为614.0710382,因为12月有31天。因此,614.0710382 = PM*31/366 = 7250*31/366.
当LapseMonth
等于12时,What I want
的值为614.0710382 - 297.1311475。
与data.table
:
library(data.table)
library(lubridate)
df<-read.table(text="Type Time PM
Ac 2016/1/1 7710
Ac 2016/2/1 27500
Ac 2016/3/1 12840
Ac 2016/4/1 20060
Ac 2016/5/1 9430
Ac 2016/6/1 9830
Ac 2016/7/1 3870
Ac 2016/8/1 12040
Ac 2016/9/1 5590
Ac 2016/10/1 4300
Ac 2016/11/1 3870
Ac 2016/12/1 2580
As 2016/1/1 315052
As 2016/2/1 478542
As 2016/3/1 491472
As 2016/4/1 662238
As 2016/5/1 464728
As 2016/6/1 530424
As 2016/7/1 443122
As 2016/8/1 603512
As 2016/9/1 564438
As 2016/10/1 440068
As 2016/11/1 462846
As 2016/12/1 525394",header=T)
dt<-as.data.table(df)
dt[,Time:=as.Date(Time,"%Y/%m/%d")]
dtapp<-dt[rep(1:.N,12-month(Time)+1)]
dtapp[,LapseMonth := seq_len(.N)-1, by =.(Type,Time,PM) ]
dtapp[,Time2:=Time-days(mday(Time)-1)+months(LapseMonth)]
dtapp[,`What I want`:=ifelse(Time==Time2,PM*15/366,PM*days_in_month(Time2)/366)]
dtapp
Type Time PM LapseMonth Time2 What I want
1: Ac 2016-01-01 7710 0 2016-01-01 315.984
2: Ac 2016-01-01 7710 1 2016-02-01 610.902
3: Ac 2016-01-01 7710 2 2016-03-01 653.033
4: Ac 2016-01-01 7710 3 2016-04-01 631.967
5: Ac 2016-01-01 7710 4 2016-05-01 653.033
---
152: As 2016-10-01 440068 1 2016-11-01 36071.148
153: As 2016-10-01 440068 2 2016-12-01 37273.519
154: As 2016-11-01 462846 0 2016-11-01 18969.098
155: As 2016-11-01 462846 1 2016-12-01 39202.803
156: As 2016-12-01 525394 0 2016-12-01 21532.541
我是 R 的新手,我想在原始行的基础上添加很多新行。
首先,我展示我的部分数据:
Type Time PM
Ac 2016-01 7710
Ac 2016-02 27500
Ac 2016-03 12840
Ac 2016-04 20060
Ac 2016-05 9430
Ac 2016-06 9830
Ac 2016-07 3870
Ac 2016-08 12040
Ac 2016-09 5590
Ac 2016-10 4300
Ac 2016-11 3870
Ac 2016-12 2580
As 2016-01 315052
As 2016-02 478542
As 2016-03 491472
As 2016-04 662238
As 2016-05 464728
As 2016-06 530424
As 2016-07 443122
As 2016-08 603512
As 2016-09 564438
As 2016-10 440068
As 2016-11 462846
As 2016-12 525394
HW 2015-12 7250
其次,我想要的是如下(我以Type Ac
、Time 2016-01 & 2016-03 & 2016-10
为例):
Type Time Time2 LapseMonth PM What I want
Ac 2016-01 2016-01 0 7710 315.9836066
Ac 2016-01 2016-02 1 0 610.9016393
Ac 2016-01 2016-03 2 0 653.0327869
Ac 2016-01 2016-04 3 0 631.9672131
Ac 2016-01 2016-05 4 0 653.0327869
Ac 2016-01 2016-06 5 0 631.9672131
Ac 2016-01 2016-07 6 0 653.0327869
Ac 2016-01 2016-08 7 0 653.0327869
Ac 2016-01 2016-09 8 0 631.9672131
Ac 2016-01 2016-10 9 0 653.0327869
Ac 2016-01 2016-11 10 0 631.9672131
Ac 2016-01 2016-12 11 0 653.0327869
Ac 2016-03 2016-03 0 12840 526.2295082
Ac 2016-03 2016-04 1 0 1052.459016
Ac 2016-03 2016-05 2 0 1087.540984
Ac 2016-03 2016-06 3 0 1052.459016
Ac 2016-03 2016-07 4 0 1087.541
Ac 2016-03 2016-08 5 0 1087.541
Ac 2016-03 2016-09 6 0 1052.459
Ac 2016-03 2016-10 7 0 1087.541
Ac 2016-03 2016-11 8 0 1052.459
Ac 2016-03 2016-12 9 0 1087.541
Ac 2016-10 2016-10 0 4300 176.2295082
Ac 2016-10 2016-11 1 0 352.4590164
Ac 2016-10 2016-12 2 0 364.2076503
我说明我要的结果:
1. Time2
是一个新列,等于 Time
.
之后的月份
2. LapseMonth
也是一个新列,等于月(Time2
) - 月(Time
)。因此,它生成如上。
3. 列What I want
很复杂。
查看 row1(Time
:2016-01, Time2
:2016-01, LapseMonth
:0, PM
:7710, What I want
:315.9836066)
当Time
= Time1
时,What I want
的公式为15/366*PM,即PM=7710
而下面是那个月的日/366*PM(即row2:610.9016393 = 29/366*7710,riow3:653.0327869 = 31/366 *7710)
我是逐行添加的,但是很多的时候效率很低type
。
我想也许我可以使用 for-loop
或 ifelse
来弄清楚。但是,我仍然没有开始的想法。
我在下面添加我的代码。由于我的数据包含多个excel,所以我一次性读取:
library(readxl)
library(data.table)
library(lubridate)
file.list <- dir(path = "filename", pattern='\.xlsx', full.names = T)
df.list <- lapply(file.list, read_excel)
df <- rbindlist(df.list)
df<-as.data.table(df)
df[,Time:=as.Date(Time,"%Y-%m")]
Time
格式更改为日期,但值全部丢失。这是怎么回事? [已解决]
df$Time <- ymd( paste( df$Time, 01, sep = "-"))
然后查看@Erdem Akkas 的回答和 运行 代码。
有些东西很特别。
看看我最后的观察结果。数据:HW 2015-12 7250
当Time
为2015时,我需要的结果与Time
in 2016.
不同
我想要的是:
Type Time Time2 LapseMonth PM What I want
HW 2015-12 2015-12 0 7250 297.1311475
HW 2015-12 2016-01 1 0 614.0710382
HW 2015-12 2016-02 2 0 574.4535519
HW 2015-12 2016-03 3 0 614.0710382
HW 2015-12 2016-04 4 0 594.2622951
HW 2015-12 2016-05 5 0 614.0710382
HW 2015-12 2016-06 6 0 594.2622951
HW 2015-12 2016-07 7 0 614.0710382
HW 2015-12 2016-08 8 0 614.0710382
HW 2015-12 2016-09 9 0 594.2622951
HW 2015-12 2016-10 10 0 614.0710382
HW 2015-12 2016-11 11 0 594.2622951
HW 2015-12 2016-12 12 0 316.9398907
以上是2015年Time
的时候,What I want
我确实需要
我知道它很复杂,所以我在下面解释一下。
1、当Time
是2015时,无论什么月份,LapseMonth
都不一样当Time
是2016。 2015 年 Time
时 LapseMonth
必须有 0~12。(见上文)
2.列What I want
与2016年Time
时计算相同,但有一个特例。当LapseMonth
等于12时,What I want
的值为原值减去LapseMonth
=0时What I want
的值。这里很奇怪。
本例中的原值为614.0710382,因为12月有31天。因此,614.0710382 = PM*31/366 = 7250*31/366.
当LapseMonth
等于12时,What I want
的值为614.0710382 - 297.1311475。
与data.table
:
library(data.table)
library(lubridate)
df<-read.table(text="Type Time PM
Ac 2016/1/1 7710
Ac 2016/2/1 27500
Ac 2016/3/1 12840
Ac 2016/4/1 20060
Ac 2016/5/1 9430
Ac 2016/6/1 9830
Ac 2016/7/1 3870
Ac 2016/8/1 12040
Ac 2016/9/1 5590
Ac 2016/10/1 4300
Ac 2016/11/1 3870
Ac 2016/12/1 2580
As 2016/1/1 315052
As 2016/2/1 478542
As 2016/3/1 491472
As 2016/4/1 662238
As 2016/5/1 464728
As 2016/6/1 530424
As 2016/7/1 443122
As 2016/8/1 603512
As 2016/9/1 564438
As 2016/10/1 440068
As 2016/11/1 462846
As 2016/12/1 525394",header=T)
dt<-as.data.table(df)
dt[,Time:=as.Date(Time,"%Y/%m/%d")]
dtapp<-dt[rep(1:.N,12-month(Time)+1)]
dtapp[,LapseMonth := seq_len(.N)-1, by =.(Type,Time,PM) ]
dtapp[,Time2:=Time-days(mday(Time)-1)+months(LapseMonth)]
dtapp[,`What I want`:=ifelse(Time==Time2,PM*15/366,PM*days_in_month(Time2)/366)]
dtapp
Type Time PM LapseMonth Time2 What I want
1: Ac 2016-01-01 7710 0 2016-01-01 315.984
2: Ac 2016-01-01 7710 1 2016-02-01 610.902
3: Ac 2016-01-01 7710 2 2016-03-01 653.033
4: Ac 2016-01-01 7710 3 2016-04-01 631.967
5: Ac 2016-01-01 7710 4 2016-05-01 653.033
---
152: As 2016-10-01 440068 1 2016-11-01 36071.148
153: As 2016-10-01 440068 2 2016-12-01 37273.519
154: As 2016-11-01 462846 0 2016-11-01 18969.098
155: As 2016-11-01 462846 1 2016-12-01 39202.803
156: As 2016-12-01 525394 0 2016-12-01 21532.541