Add a column to a data frame that index the number of occurrences in a group

本小妞迷上赌 提交于 2019-12-13 09:17:36

问题


Given data frame like this

 Unit    Anything
 A       3.4
 A1      2.2
 A       6.9
 A1      1.1
 B       2
 B       3

Sort by anything, group by unit, add an index

 Unit    Anything   Index
 A       3.4         1
 A1      2.2         2
 A       6.9         2
 A1      1.1         1
 B       2           1
 B       3           2

I know df[order(df$Anything),] orders by Anything. But I can't get a count to work. I tried stuff like

dt = data.table(df)
dt[,count := .N, by = list(Unit)]

回答1:


After reading the related topics, by trial and error, the following seems to work.... ref: Add a "rank" column to a data frame

df <- read.table(header = TRUE, text = "
 Unit    Anything
 A       3.4
 A1      2.2
 A       6.9
 A1      1.1
 B       2
 B       3
")

df <- transform(df, x= ave(Anything,Unit,FUN=function(x) order(x,decreasing=F)))

df
  Unit Anything x
1    A      3.4 1
2   A1      2.2 2
3    A      6.9 2
4   A1      1.1 1
5    B      2.0 1
6    B      3.0 2



回答2:


Try following code:

ddf = structure(list(Unit = structure(c(1L, 2L, 1L, 2L, 3L, 3L), .Label = c("A", 
"A1", "B"), class = "factor"), Anything = c(3.4, 2.2, 6.9, 1.1, 
2, 3)), .Names = c("Unit", "Anything"), class = "data.frame", row.names = c(NA, 
-6L))

ddf2 = ddf[order(ddf$Unit, ddf$Anything),]
ddf2$index = 0

for(U in unique(ddf$Unit)){
    ddf2[ddf2$Unit==U,]$index = 1:length(ddf2[ddf2$Unit==U,]$Unit)
}

ddf2
  Unit Anything index
1    A      3.4     1
3    A      6.9     2
4   A1      1.1     1
2   A1      2.2     2
5    B      2.0     1
6    B      3.0     2


来源:https://stackoverflow.com/questions/25516365/add-a-column-to-a-data-frame-that-index-the-number-of-occurrences-in-a-group

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!