【发布时间】:2012-04-26 10:19:34
【问题描述】:
如何在 R 中的矩阵中为所有变量获取实际响应模式的数量?例如,我有一个由 3 个变量 a、b、c 和三个观察值组成的数据集。
a<-c(0,1,0)
b<-c(1,0,1)
c<-c(1,0,1)
d<-cbind(a,b,c)
产生矩阵
d
如果我没记错的话,它有两种响应模式:0,1,1 出现在两个观察中,1,0,0 出现在一个观察中。是否有一个函数可以告诉我是否需要在更大的数据集中进行计算?
谢谢
【问题讨论】:
如何在 R 中的矩阵中为所有变量获取实际响应模式的数量?例如,我有一个由 3 个变量 a、b、c 和三个观察值组成的数据集。
a<-c(0,1,0)
b<-c(1,0,1)
c<-c(1,0,1)
d<-cbind(a,b,c)
产生矩阵
d
如果我没记错的话,它有两种响应模式:0,1,1 出现在两个观察中,1,0,0 出现在一个观察中。是否有一个函数可以告诉我是否需要在更大的数据集中进行计算?
谢谢
【问题讨论】:
另一种可能性是使用duplicated()。这将只获得独特响应模式的数量,而不是它们是什么。
length( which( !duplicated(d) ) )
# [1] 2
这看起来比使用apply() 和/或table() 快得多。
【讨论】:
什么,还没有ddply 解决方案吗?你们plyr的粉丝越来越慢了……
> library(plyr)
> d <- as.data.frame(d)
> ddply(d, ~a+b+c, summarize, n=length(c))
a b c n
1 0 1 1 2
2 1 0 0 1
也可以使用paste 创建公式,以减少键入次数:
f <- paste("~", paste(names(d), collapse="+"))
ddply(d, as.formula(f), summarize, n=length(c))
【讨论】:
你可以试试:
table(apply(d, 1, paste, collapse=""))
【讨论】:
merge 使用 \b),因为两个不同的组合可能会折叠成同一个东西(例如,@ 987654324@ 和 12,1.)
主题的变化,允许选择感兴趣的列。
d<-data.frame(d)
d$combined<-with(d, paste(a,b,c))
table(d$combined)
0 1 1 1 0 0
2 1
data.frame(table(d$combined))
Var1 Freq
1 0 1 1 2
2 1 0 0 1
有关提示,请参阅count unique values in R。
【讨论】: