首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R根据原始行追加新行。

R根据原始行追加新行。
EN

Stack Overflow用户
提问于 2017-04-17 09:45:37
回答 1查看 100关注 0票数 1

我在R中是新的,我想在原始行的基础上添加很多新行。

首先,我展示了我的部分数据:

代码语言:javascript
复制
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 AcTime 2016-01 & 2016-03 & 2016-10为例):

代码语言:javascript
复制
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(即行2:610.9016393= 29/366*7710,riow3:653.0327869 = 31/366*7710)

我逐行添加每一行,但是当有许多type时,效率很低。

我想也许我可以用for-loopifelse来找出。不过,我还是不知道该怎么开始。

我在下面添加我的代码。由于我的数据包含多个excel,所以我一次读取它:

代码语言:javascript
复制
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格式更改到日期,但值全部丢失。怎么回事?解决了

代码语言:javascript
复制
df$Time <- ymd( paste( df$Time, 01, sep = "-"))

然后查看@Erdem Akkas的答案并运行代码。

有一些非常特别的东西。

看看我的最后一个乳房。数据:HW 2015-12 7250

Time2015时,我需要的结果与2016中的Time不同。

我想要的是:

代码语言:javascript
复制
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

以上是Time在2015年的时候,我真正需要的What I want

我知道它非常复杂,所以我在下面解释它。

  1. Time2015时,不管哪个月,当Time2016时,LapseMonth就不一样了。LapseMonth在2015年Time时必须有0~12。(见上文)
  2. What I want与2016年Time的计算相同。然而,有一个特例。当LapseMonth等于12时,当LapseMonth=0时,What I want的值为原始值减去What I want的值。这里很奇怪。 本例中的原始值为614.0710382,因为12月有31天。因此,614.0710382 = PM*31/366 = 7250*31/366。 当What I want = 12时,的值为614.0710382 ~ 297.1311475.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-17 10:26:55

data.table

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43449029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档