日期R中组内的差异,并根据特定条件创建新列

时间:2015-05-27 22:45:17

标签: r

在创建新数据框时需要帮助,该数据框将包含名为Name和Value_2的列。 现有数据框包括Name,Date和Value_1等列。将使用遵循条件的现有数据帧创建新数据帧。以下是现有的数据框架,以便更清晰: -

{% url 'frontpage1:frontpage:edit_page' slug='SLUG' %}
{% url 'frontpage2:frontpage:edit_page' slug='SLUG' %}

在组名A中,第一次测试是在2011年9月28日进行的,其中value_1为12345,最后一次测试是在2013年6月3日进行的,其值为1的是23456.因此,新数据框中的value_2遵循条件以检查log10(12345)-log10(23456)> = 2并且在ne数据帧的value_2列中将组名A分类为是/否。其他组也需要遵循类似的条件。以下是您参考的所需输出: -

Name    Date       Value_1
A       9/28/2011  12345
A       1/8/2012   23456
A       6/3/2013   78910
B       10/4/2010  438504
B       10/14/2013 439587
C       8/22/2013  436096
D       4/20/2010  3258043
D       3/24/2013  968347
D       7/8/2013   954733
D       8/19/2013  438578

值_2遵循log10(第一个测试日期value_1)-log10(最后测试日期value_1)> = 2的条件。

2 个答案:

答案 0 :(得分:1)

这是一个split-apply-combine问题,建议使用tapply by aveaggregate以及扩展程序包plyr,{{{{{ 1}}甚至是dplyr。在这种情况下,简单的data.tabletapply可以根据您想要的输出格式工作(使用@ Robert的aggregate):

Data

答案 1 :(得分:0)

你可以试试这个:

Data <- read.table(textConnection("
Name    Date       Value_1
A       9/28/2011  12345
A       1/8/2012   23456
A       6/3/2013   78910
B       10/4/2010  438504
B       10/14/2013 439587
C       8/22/2013  436096
D       4/20/2010  3253043
D       3/24/2013  968347
D       7/8/2013   954733
D       8/19/2013  438"), stringsAsFactors=FALSE,head=TRUE)

Data$Date=as.Date(Data$Date,"%m/%d/%Y")
Names=unique(Data$Name)
sdf=lapply(Names,function(x)Data[Data$Name == x,])
Value_2=sapply(sdf,function(dt){
  rx=dt$Date%in%range(dt$Date)
  if (length(rx)==1) return("No") else
  return(ifelse(-diff(log10(dt$Value_1[rx]))>=2,"Yes","No"))
})
data.frame(Names,Value_2)
  Names Value_2
1     A      No
2     B      No
3     C      No
4     D     Yes