使用 R data.table 计算条件比例的更简单方法?

ska*_*kan 3 r data.table

假设我们有这个玩具示例:

library(data.table)
temp <- data.table(first=c("A", "A","A", "A","B","C","C"), 
   sec=c("X", "X","X", "Y","X",  "Z","Z"), stringsAsFactors = T))

first sec
  A   X
  A   X
  A   X
  A   Y
  B   X
  C   Z
  C   Z
Run Code Online (Sandbox Code Playgroud)

我想得到第三列,说明该组合在第一列出现的次数中的比例。

我必须通过以下方式对 data.table 进行处理:

temp[,N1:=.N,by=.(first, sec)]
temp[,N2:=.N,by=first]
temp[, prop := N1/N2]
temp[,c("N1","N2"):=NULL]


first sec prop
   A   X 0.75
   A   X 0.75
   A   X 0.75
   A   Y 0.25
   B   X 1.00
   C   Z 1.00
   C   Z 1.00
Run Code Online (Sandbox Code Playgroud)

这意味着 A,X 发生了 3 次。A 出现 4 次,因此 AX 出现在第一个字母是 A 的情况下的 75%。

那不能更容易吗?

的种类

temp[,.N(first,sec)/.N(first)]
Run Code Online (Sandbox Code Playgroud)

mt1*_*022 5

在每个第一级组内进行分组怎么样ave

temp[, prop := ave(as.numeric(sec), sec, FUN = length) / .N, by = .(first)]
# > temp
#    first sec prop
# 1:     A   X 0.75
# 2:     A   X 0.75
# 3:     A   X 0.75
# 4:     A   Y 0.25
# 5:     B   X 1.00
# 6:     C   Z 1.00
# 7:     C   Z 1.00
Run Code Online (Sandbox Code Playgroud)

灵感来源:https : //stackoverflow.com/a/32003058/3926543

另一种方式:链式命令:

temp[,N:=.N,by=.(first, sec)][, prop := N / .N, by = .(first)][, N := NULL]
Run Code Online (Sandbox Code Playgroud)

first并且sec有多个级别并且temp有更多行时,链接命令或 OP 问题中的解决方案将比ave解决方案更快。