Dataframe 将新列添加到df中

Dataframe 将新列添加到df中,dataframe,datatable,Dataframe,Datatable,一段时间内,它看起来是这样的 Name Date Value NewColumn other columns A 2000-01 0.5 A 2001-03 0.4 0 A 2002-02 1.0 1 A 2003-05 0.9 0 A 2004-06 0.9 A 2006-03 0.4

一段时间内,它看起来是这样的

Name    Date       Value     NewColumn   other columns
A       2000-01      0.5      
A       2001-03      0.4      0
A       2002-02      1.0      1  
A       2003-05      0.9      0
A       2004-06      0.9
A       2006-03      0.4        <- no previous year
Name日期值NewColumn其他列
A 2000-01 0.5
A 2001-03年度0.4 0
A 2002-02 1.0 1
A 2003-05年度0.90
A 2004-06年度0.9
A 2006-03 0.4
df=read.table(text=”
名称日期值
A 2000-01 0.5
A 2001-03年度0.4
A 2002-02 1.0
A 2003-05年度0.9
A 2004-06年度0.9
A 2006-03年度0.4
,标题=T,字符串=F)
图书馆(dplyr)
df%>%
按(名称)%>%#为每个名称分组
变异(变化=值/滞后(值)-1,#获得值的变化(增加或减少)
year=as.numeric(substr(Date,1,4)),从日期开始获取年份
NewColumn=情况(更改>0.01&滞后(年))=第1年~1年#如果更改超过1%,且前一行在标记为1之前1年
如果更改小于1%,且前一行在标记为0之前1年,则更改<-0.01&滞后(年)=1年(0))%>%
解组()
##tibble:6 x 6
#名称日期值更改年份新列
#                
#1 A 2000-01 0.5 NA 2000 NA
#2 A 2001-03 0.4-0.200 2001 0
#3 A 2002-02 11.5 2002 1
#4 A 2003-05 0.9-0.100 2003 0
#5 A 2004-06 0.9 0 2004 NA
#6a 2006-03 0.4-0.556 2006北美
您可以删除一些不必要的变量。我留下它们只是为了帮助您理解这个过程是如何工作的。

df=read.table(text=”
名称日期值
A 2000-01 0.5
A 2001-03年度0.4
A 2002-02 1.0
A 2003-05年度0.9
A 2004-06年度0.9
A 2006-03年度0.4
,标题=T,字符串=F)
图书馆(dplyr)
df%>%
按(名称)%>%#为每个名称分组
变异(变化=值/滞后(值)-1,#获得值的变化(增加或减少)
year=as.numeric(substr(Date,1,4)),从日期开始获取年份
NewColumn=情况(更改>0.01&滞后(年))=第1年~1年#如果更改超过1%,且前一行在标记为1之前1年
如果更改小于1%,且前一行在标记为0之前1年,则更改<-0.01&滞后(年)=1年(0))%>%
解组()
##tibble:6 x 6
#名称日期值更改年份新列
#                
#1 A 2000-01 0.5 NA 2000 NA
#2 A 2001-03 0.4-0.200 2001 0
#3 A 2002-02 11.5 2002 1
#4 A 2003-05 0.9-0.100 2003 0
#5 A 2004-06 0.9 0 2004 NA
#6a 2006-03 0.4-0.556 2006北美

您可以删除一些不必要的变量。我留下它们只是为了帮助您理解该过程是如何工作的。

由于问题已被标记为
数据。表
,下面是一个相应的解决方案,它使用了一些棘手的算法,包括
NA
和逻辑值:

library(data.table)
setDT(DT)[order(Date), NewColumn := {
  yr <- year(lubridate::ymd(Date, truncated = 1L))
  chg <- Value / shift(Value) - 1.0
  NA^(yr - shift(yr) != 1L) * NA^(!abs(chg) > 0.01) * (sign(chg) / 2.0 + 0.5)
}, by = Name][]
这里的技巧是使用以下事实:
NA^0
是1,
NA^1
NA
,并且
FALSE
对应于0,
TRUE
对应于1,这样

NA^c(FALSE, TRUE)
返回

资料
库(data.table)

DT由于问题已被标记为
数据。表
,因此这里有一个相应的解决方案,它使用了一些复杂的算法和
NA
和逻辑值:

library(data.table)
setDT(DT)[order(Date), NewColumn := {
  yr <- year(lubridate::ymd(Date, truncated = 1L))
  chg <- Value / shift(Value) - 1.0
  NA^(yr - shift(yr) != 1L) * NA^(!abs(chg) > 0.01) * (sign(chg) / 2.0 + 0.5)
}, by = Name][]
这里的技巧是使用以下事实:
NA^0
是1,
NA^1
NA
,并且
FALSE
对应于0,
TRUE
对应于1,这样

NA^c(FALSE, TRUE)
返回

资料
库(data.table)

DT您的结果不符合OP的期望,因为您使用了错误的阈值0.1(10%)而不是0.01(1%)。您的结果不符合OP的期望,因为您使用了错误的阈值0.1(10%)而不是0.01(1%)。
[1]  1 NA
library(data.table)
DT <- fread("Name      Date       Value
A       2000-01      0.5
A       2001-03      0.4 
A       2002-02      1.0
A       2003-05      0.9
A       2004-06      0.9
A       2006-03      0.4 ")