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.4df=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 ")