この形式の配列があるとしましょう
X Y Z
A 1 0
A 2 1
B 1 1
B 2 1
B 1 0
X の周波数と X を指定した Y の周波数を見つけて、それらを配列に追加したい
X Y Z F(x) F(Y|X)
A 1 0 2 1
A 2 1 2 1
B 1 1 3 2
B 2 1 3 1
B 1 0 3 2
この形式の配列があるとしましょう
X Y Z
A 1 0
A 2 1
B 1 1
B 2 1
B 1 0
X の周波数と X を指定した Y の周波数を見つけて、それらを配列に追加したい
X Y Z F(x) F(Y|X)
A 1 0 2 1
A 2 1 2 1
B 1 1 3 2
B 2 1 3 1
B 1 0 3 2
data.table
方法は次のとおりです。
require(data.table)
DT <- data.table(dat)
DT[,nx:=.N,by=X][,nxy:=.N,by=list(X,Y)]
最後のステップで 2 つの列が作成されました。
DT
# X Y Z nx nxy
# 1: A 1 0 2 1
# 2: A 2 1 2 1
# 3: B 1 1 3 2
# 4: B 2 1 3 1
# 5: B 1 0 3 2
また、1 行ではなく 2 行で記述できた可能性があります。
DT[,nx:=.N,by=X]
DT[,nxy:=.N,by=list(X,Y)]
# Assuming your data frame is called df:
df$Fx <- ave(as.numeric(as.factor(df$X)), df$X, FUN = length)
df2 <- as.data.frame(with(df, table(X, Y)), responseName = "Fyx")
df3 <- merge(df, df2)
# please see @thelatemail's clean `ave`-only calculation of 'Fyx'
df3
# X Y Z Fx Fyx
# 1 A 1 0 2 1
# 2 A 2 1 2 1
# 3 B 1 1 3 2
# 4 B 1 0 3 2
# 5 B 2 1 3 1
# And a ddply alternative
library(plyr)
df2 <- ddply(.data = df, .variables = .(X), mutate,
Fx = length(X))
ddply(.data = df2, .variables = .(X, Y), mutate,
Fxy = length(Y))