我有以下数据,我想知道如何通过base,plyr或其他软件包生成每个响应的频率表。
我的数据:
df = data.frame(id = c(1,2,3,4,5),
Did_you_use_tv=c("tv","","","tv","tv"),
Did_you_use_internet=c("","","","int","int"))
df
我可以使用表
运行表并获取任何列的频率table(df[,2])
table(df[,2], df[,3])
但是,我如何设置数据,使其如下所示。
df2 = data.frame(Did_you_use_tv=c(3),
Did_you_use_internet=c(2))
df2
这只是每列频率的摘要。
我将创建交叉表但是考虑到数据的结构,我觉得这可能会更有用。
答案 0 :(得分:2)
这在概念上类似于@ Tyler的回答。只需取所有不等于""
的值的总和:
colSums(!df[-1] == "")
# Did_you_use_tv Did_you_use_internet
# 3 2
Stack Overflow用户@juba完成了一些工作on a function called multi.table
,如下所示:
multi.table <- function(df, true.codes=NULL, weights=NULL) {
true.codes <- c(as.list(true.codes), TRUE, 1)
as.table(sapply(df, function(v) {
sel <- as.numeric(v %in% true.codes)
if (!is.null(weights)) sel <- sel * weights
sum(sel)
}))
}
该功能是questionr package。
的一部分您的示例中的用法是:
library(questionr)
multi.table(df[-1], true.codes=list("tv", "int"))
# Did_you_use_tv Did_you_use_internet
# 3 2
答案 1 :(得分:1)
这是我想到的一种方法:
FUN <- function(x) sum(x != "")
do.call(cbind, lapply(df[, -1], FUN))
## Did_you_use_tv Did_you_use_internet
## [1,] 3 2
答案 2 :(得分:1)
这是另一种方法
> do.call(cbind, lapply(df[,-1], table))[-1, ]
Did_you_use_tv Did_you_use_internet
3 2
答案 3 :(得分:0)
使用plyr
和reshape2
t(dcast(subset(melt(df,id.var="id"), value!=""), variable ~ .))