假设我有一个这种格式的数组
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)]
最后一步创建了两列:
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
它可以写成两行而不是一行:
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))
使用ave
并假设您的数据是dat
dat$Fx <- with(dat,ave(Y,list(X),FUN=length))
dat$Fyx <- with(dat,ave(Y,list(X,Y),FUN=length))
结果:
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 2 1 3 1
5 B 1 0 3 2
如果数据没有可供ave
处理的数字列,则:
dat$Fx <- with(dat,ave(seq_len(nrow(dat)),list(X),FUN=length))
dat$Fyx <- with(dat,ave(seq_len(nrow(dat)),list(X,Y),FUN=length))