在创建新数据框时需要帮助,该数据框将包含名为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的条件。
答案 0 :(得分:1)
这是一个split-apply-combine
问题,建议使用tapply
by
ave
和aggregate
以及扩展程序包plyr
,{{{{{ 1}}甚至是dplyr
。在这种情况下,简单的data.table
或tapply
可以根据您想要的输出格式工作(使用@ 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