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)]

最後のステップで 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)]
于 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 に答える