我有一个我在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日,为了清晰,并试图获得兴趣。
答案 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
语法。