ID和计数按时间排序的重复数据组

时间:2016-11-14 18:30:53

标签: r dplyr plyr lapply

我有一个我在R中处理的数据集。我想将一个类别的出现随时间分组,表明每个组出现的顺序。

数据按“id”分组,按“时间”采样,并有一个“类别”标签(低,高)。

if let person = realm.object(ofType: Person.self, forPrimaryKey: "id") {
    for (_, dict): (String, JSON) in response {
        //Create dog using the dict info,my custom init method
        if let dog = Dog(dict: dict)
        {
            try! realm.write {
                //save it to realm
                realm.create(Dog, value: dog, update: true)
                //get the dog reference from the database
                let realmDog = realm.object(ofType: Dog.self, forPrimaryKey: "id")
                //append dog to person
                person.dogs.append(realmDog)
            }
        }
    }
    try! realm.write {
        //save person
        realm.create(person .self, value: collection, update: true)
    }
}

我想创建一个变量“group”,用于标记每个类别所属的时间组,例如: 如果在时间X和时间X + 1处类别==类别,则它们在同一组中 如果在时间X和时间X + 1处类别!=类别,则组结束

随着时间的推移对组进行排序,以便给定“类别”组的第一次出现是1,然后是2。

这与计算每个类别标签在一段时间内出现次数的序列不同。虽然我需要对“组”值进行排序,但我需要在连续“类别”的每个“组”内重复该值。

#make example data
id <- c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b")
time <- seq.POSIXt(as.POSIXct("10/24/16 21:05", format="%m/%d/%y %H:%M", tz="America/Chicago"), by="5 min", length.out=10)
category <- c("low", "high", "high", "low", "low", "low", "high", "high", "low", "low")
dat<-data.frame(id, time, category)
> dat
   id                time category
1   a 2016-10-24 21:05:00      low
2   a 2016-10-24 21:10:00     high
3   a 2016-10-24 21:15:00     high
4   a 2016-10-24 21:20:00      low
5   a 2016-10-24 21:25:00      low
6   b 2016-10-24 21:30:00      low
7   b 2016-10-24 21:35:00     high
8   b 2016-10-24 21:40:00     high
9   b 2016-10-24 21:45:00      low
10  b 2016-10-24 21:50:00      low

基本上,这个想法是“群体”是一个事件,可以在不同的时间长度内发生。但即使它的长度不同,它仍然是同一个事件。所以你有第一个事件,第二个事件等。

我在网上搜索过,但没看过与该问题相符的帖子。如果我忽略了以前的帖子,欢迎链接到相关帖子。

提前感谢您的帮助!

编辑,2016年12月14日,为了清晰,并试图获得兴趣。

2 个答案:

答案 0 :(得分:1)

以基地R:

rowid

data.table 的开发版本中的library(data.table) setDT(dat)[, episode := rowid(category)]

library(dplyr)
dat %>% 
  group_by(category) %>% 
  mutate(episode = row_number())

dplyr

                  time category episode
                <dttm>   <fctr>   <int>
1  2016-10-24 21:05:00      low       1
2  2016-10-24 21:10:00     high       1
3  2016-10-24 21:15:00     high       2
4  2016-10-24 21:20:00      low       2
5  2016-10-24 21:25:00      low       3
6  2016-10-24 21:30:00   normal       1
7  2016-10-24 21:35:00     high       3
8  2016-10-24 21:40:00     high       4
9  2016-10-24 21:45:00      low       4
10 2016-10-24 21:50:00     high       5

所有将给出所需的最终结果(显示dplyr的输出):

public class Solution 
{
    public String frequencySort(String s) 
   {
    Map<Character,Integer> map =new HashMap<Character,Integer>();
    for(int i=0;i<s.length();i++)
    {
        if(map.containsKey(s.charAt(i)))
            map.put(s.charAt(i),map.get(s.charAt(i))+1);
        else
            map.put(s.charAt(i),1);
    }

    List<Map.Entry<Character,Integer>> sortedlist = new ArrayList<>(map.entrySet());
    Collections.sort(sortedlist, new Comparator<Map.Entry<Character,Integer>>() {

    @Override
    public int compare(Map.Entry<Character, Integer> o1,
            Map.Entry<Character, Integer> o2) {
        return o2.getValue() - o1.getValue();
    }
    });

    String lastString="";
    for (Map.Entry<Character,Integer>  e : sortedlist) 
    {
        for(Integer j=0;j <  e.getValue();j++)
           lastString+= e.getKey().toString();
    }
    return lastString;
   }
}

答案 1 :(得分:0)

我不是100%确定这是你所追求的,但假设我理解了你的问题,你可以使用data.table包完成这个非常简单和优雅的工作。

library(data.table)
setDT(dat)
dat[, episode := 1:.N, by = category]

#                    time category episode
#  1: 2016-10-24 21:05:00      low       1
#  2: 2016-10-24 21:10:00     high       1
#  3: 2016-10-24 21:15:00     high       2
#  4: 2016-10-24 21:20:00      low       2
#  5: 2016-10-24 21:25:00      low       3
#  6: 2016-10-24 21:30:00   normal       1
#  7: 2016-10-24 21:35:00     high       3
#  8: 2016-10-24 21:40:00     high       4
#  9: 2016-10-24 21:45:00      low       4
# 10: 2016-10-24 21:50:00     high       5

说明:.N是一个特殊变量,包含每个组中的计数数量(由by设置)。 :=是用于分配值的特殊data.table语法。