循环进入R查找先前的比赛

时间:2018-09-09 22:59:24

标签: r database loops dataframe

我需要一些帮助来在R中编写循环函数。当出现相同的ID时,我有一些问题要选择先前的匹配项,然后再写入OLD_RANK列和NEW_RANK列。

OLD_RANK必须是找到的上一个匹配项的NEW_RANK

`NEW_RANK`<- OLD_RANK+0.05(S1-S2)

在此示例中,我的数据

JUNK<- matrix(c(1,1,10,20,3,2,30,40,1,3,60,4,3,
4,5,40,1,5,10,30,7,6,20,20),ncol=4,byrow=TRUE)
colnames(JUNK) <- c("ID1","DAY","S1","S2")
JUNK<- as.data.frame(JUNK)

我认为可能是一个好的开始:

#subset to find previous match. Find matches before days and if more matches are 
#found, choose the row with higher values in `days`
loop for each row
s1 <- subset(s1, DAYS < days)
s1 <- subset(s1, DAYS = max(days))

#if no match fuond JUNK$OLD_RANK<-35 and JUNK$NEW_RANK <-JUNK$OLD_RANK+0.05(S1-S2)
#if previous match is found JUNK$NEW_RANK <-JUNK$OLD_RANK+0.05(S1-S2)

预期结果:

ID1    DAYS    S1     S2     OLD_RANK   NEW_RANK
1        1     10      20      35        34.5
3        2     30      40      35        34.5
1        3     60      4       34.5      37.3
3        4     5       40      34.5      32.75
1        5     10      30      37.3      36.3
7        6     20      20      35        35

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是一种方法:

static ScriptMain()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    }

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (args.Name.Contains("Newtonsoft.Json"))
        {
            return System.Reflection.Assembly.LoadFile(@"C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\ToolsRef\Newtonsoft.Json.dll");
        }

        if (args.Name.Contains("Microsoft.Azure.DataLake.Store"))
        {
            return System.Reflection.Assembly.LoadFile(@"C:\Program Files\WindowsPowerShell\Modules\AzureRM.DataLakeStore\5.2.0\Microsoft.Azure.DataLake.Store.dll");
        }

        if (args.Name.Contains("Microsoft.Rest.ClientRuntime.Azure.Authentication"))
        {
            return System.Reflection.Assembly.LoadFile(@"C:\Program Files\WindowsPowerShell\Modules\Azure\5.1.2\StorSimple\Microsoft.Rest.ClientRuntime.Azure.Authentication.dll");
        }

        if (args.Name.Contains("Microsoft.Rest.ClientRuntime"))
        {
            return System.Reflection.Assembly.LoadFile(@"C:\Program Files\WindowsPowerShell\Modules\Azure\5.1.2\Services\Microsoft.Rest.ClientRuntime.dll");
        }
       if (args.Name.Contains("NLog"))
        {
        return System.Reflection.Assembly.LoadFile(@"C:\Users\<user>\source\repos\Integration Services Project2\NLog.dll");
        }

        return null;

       }

结果:

library(dplyr)
JUNK2 <- JUNK %>%
  group_by(ID1) %>%
  mutate(change   = 0.05*(S1-S2),
         NEW_RANK = 35 + cumsum(change),
         OLD_RANK = lag(NEW_RANK) %>% if_else(is.na(.), 35, .)) %>%
  ungroup()   # EDIT: Added to end with ungrouped table