如何查找每个ID的月份频率?

时间:2014-08-14 21:46:07

标签: r

我有这个数据帧(全部),我试图找到每个ID中季节的最高频率。

ID    hot   index season
41400 10      2   DJF  
41400 12      2   DJF
41400 75      4   JJA
41401 89      5   SON 
41401 25      3   SON
41401 100     6   SON
20445 67      4   MAM 
20445 89      6   MAM
20445 4       1   DJF
20443 67      5   SON
20443 120.2   7   SON
20443 140.5   8   SON 
20423 170.5   10  DJF
20423 78.1    5   MAM 

预期输出


    ID    hot   index season
    41400 10      2   DJF  
    41400 12      2   DJF
    41400 75      4   DJF
    41401 89      5   SON 
    41401 25      3   SON
    41401 100     6   SON
    20445 67      4   MAM 
    20445 89      6   MAM
    20445 4       1   MAM
    20443 67      5   SON
    20443 120.2   7   SON
    20443 140.5   8   SON 
    20423 170.5   10  DJF
    20423 78.1    5   DJF

从这个问题可以看出,我之前使用

计算了相同数据的均值

How can I find mean values in a column based on a different column?

meaned<-with(all, ave(index, ID, FUN=mean))
cbind(all, meaned)  

我这样做,但我认为我走的路是错误的

seasonfreq1<-count(all,c(ID,"season"))
seasonfreq2<-with(ID, ave(freq, ID, FUN=max))

但我不确定如何找到频率(或者是否有其他方法)。也许lapply?谢谢!

2 个答案:

答案 0 :(得分:3)

我会选择data.table(假设您的数据名为df

library(data.table)
setDT(df)[, freq := .N, by = list(ID, season)]
df[, season := season[which.max(freq)], by = ID][, freq := NULL] # You can leave the `freq` column if you want to see the frequencies

#       ID   hot index season
# 1: 41400  10.0     2    DJF
# 2: 41400  12.0     2    DJF
# 3: 41400  75.0     4    DJF
# 4: 41401  89.0     5    SON
# 5: 41401  25.0     3    SON
# 6: 41401 100.0     6    SON
# 7: 20445  67.0     4    MAM
# 8: 20445  89.0     6    MAM
# 9: 20445   4.0     1    MAM
#10: 20443  67.0     5    SON
#11: 20443 120.2     7    SON
#12: 20443 140.5     8    SON
#13: 20423 170.5    10    DJF
#14: 20423  78.1     5    DJF

答案 1 :(得分:0)

使用ave,可能是:

with(all,ave(season,ID,FUN=function(x) names(sort(table(x),decreasing=TRUE)[1])))
# [1] DJF DJF DJF SON SON SON MAM MAM MAM SON SON SON DJF DJF
#Levels: DJF JJA MAM SON