r - 如何将计数器分配给由因子组合定义的 data.frame 的特定子集?

标签 r indexing combinations tapply

我的问题是:我有一个包含一些因子变量的数据框。我现在想为这个数据框分配一个新向量,它为这些因子变量的每个子集创建一个索引。

   data <-data.frame(fac1=factor(rep(1:2,5)), fac2=sample(letters[1:3],10,rep=T))

给了我类似的东西:
        fac1 fac2
     1     1    a
     2     2    c
     3     1    b
     4     2    a
     5     1    c
     6     2    b
     7     1    a
     8     2    a
     9     1    b
     10    2    c

我想要的是一个组合计数器,它计算每个因素组合的出现。像这样
        fac1 fac2  counter
     1     1    a        1
     2     2    c        1
     3     1    b        1
     4     2    a        1
     5     1    c        1
     6     2    b        1
     7     1    a        2
     8     2    a        2
     9     1    b        2
     10    1    a        3

到目前为止,我想过使用 tapply 来获取所有因子组合的计数器,这很好用
counter <-tapply(data$fac1, list(data$fac1,data$fac2), function(x) 1:length(x))

但我不知道如何在不使用低效循环的情况下将计数器列表(例如未列出)分配给数据帧中的组合:)

最佳答案

这是 ave() 的工作功能:

# Use set.seed for reproducible examples 
#   when random number generation is involved
set.seed(1) 
myDF <- data.frame(fac1 = factor(rep(1:2, 7)), 
                   fac2 = sample(letters[1:3], 14, replace = TRUE), 
                   stringsAsFactors=FALSE)
myDF$counter <- ave(myDF$fac2, myDF$fac1, myDF$fac2, FUN = seq_along)
myDF
#    fac1 fac2 counter
# 1     1    a       1
# 2     2    b       1
# 3     1    b       1
# 4     2    c       1
# 5     1    a       2
# 6     2    c       2
# 7     1    c       1
# 8     2    b       2
# 9     1    b       2
# 10    2    a       1
# 11    1    a       3
# 12    2    a       2
# 13    1    c       2
# 14    2    b       3

注意使用 stringsAsFactors=FALSEdata.frame()步。如果你没有,你仍然可以得到输出:myDF$counter <- ave(as.character(myDF$fac2), myDF$fac1, myDF$fac2, FUN = seq_along) .

关于r - 如何将计数器分配给由因子组合定义的 data.frame 的特定子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071669/

相关文章:

git - merge 在 git 存储库中的子项目中增长的基础项目,除了 git 子模块或子树 merge 方法之外

r - 在 R 中数据表的 by= 调用中循环编号变量

java - 我应该在此程序中传递什么参数以避免java.lang错误?

Elasticsearch 索引类型在更新状态后没有改变

javascript - 如何从对象数组中的嵌套数组中获取数组值的组合

c++ - int/float/string值之间的操作,组合太多

r - R 中 system() 的运算符

linux - 为什么 stat mtime 每秒只更新两次?

r - R中非常小数的算术

mysql - 如何提高Mysql表的性能——索引、集群、PK?