【问题标题】:Add a column to a data frame that index the number of occurrences in a group将一列添加到索引组中出现次数的数据框
【发布时间】:2014-10-20 09:37:49
【问题描述】:

给定这样的数据框

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

按任何东西排序,按单元分组,添加索引

 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

我知道df[order(df$Anything),]Anything 订购。 但我无法计数工作。我试过像

这样的东西
dt = data.table(df)
dt[,count := .N, by = list(Unit)]

【问题讨论】:

  • 一种方法是先通过Unit 订购df,然后使用tapply,例如d$Index <- do.call(c, tapply(d$Unit, d$Unit, function(x) 1:length(x)))
  • @parsimoni 谢谢,这运行得很快。
  • d$Index

标签: r indexing row grouping


【解决方案1】:

阅读相关主题后,通过反复试验,以下似乎可行.... 参考: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

【讨论】:

  • 这个问题已被多次询问和回答。当您在“相关主题”中找到答案时,您可能应该留下重复链接和/或删除它。
  • 此答案无效,因为“任何”列包含日期。
  • 如果不是答案,那么您应该 a) 删除它,b) 编辑您的问题以创建一个包含日期的示例。
【解决方案2】:

试试下面的代码:

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

【讨论】:

  • 谢谢!!!我应该让这个例子更类似于我的实际问题。有 113000 行,大约 500 个单元号,按数量排序是一个日期值(这在您的解决方案中不是问题)。您的解决方案运行大约需要 3 分钟。下面我的解决方案不适用于日期。
  • 你应该勾选赞成/接受有用的答案。
  • 使用:ddf2=data.table(ddf2) 并尝试在此链接上给出的解决方案,而不是上面的“for”循环。它可能会更快。让我们知道结果。 stackoverflow.com/questions/25532844/…
猜你喜欢
  • 2020-12-13
  • 2019-04-19
  • 2019-01-16
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2021-11-27
  • 2023-01-10
  • 2015-12-02
相关资源
最近更新 更多