5

假设我有一个这种格式的数组

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
4

3 回答 3

6

这里有一个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)]
于 2013-09-17T22:23:16.797 回答
3
# 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))
于 2013-09-17T21:54:55.477 回答
3

使用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))
于 2013-09-17T23:01:36.640 回答