在apply函数中使用零值进行计数

时间:2015-05-13 10:39:21

标签: r count dataframe apply

我试图根据apply函数中定义的列表使用零次出现的计数。我已经设法单独完成这些工作,但最好还是将它们放在一行中。这是我的目标:

list <- c("x", "y", "z")

df       
    V1   V2   V3
    x    y    y
    x    x    z
    y    z    z

期望的结果

     V1    V2   V3
 x   2     1    0
 y   1     1    1
 z   0     1    2

所以我设法为单个专栏做了这个:

out <- table(factor(df$V1,levels=list))

对于没有定义列表的所有列(因此没有出现零)

occurences <- (apply(df,2,(table)))

理想情况下,我想要一个在另一个里面,例如:

occurences <- as.data.frame(apply(df,2,(table(factor(df,levels=list)))))

令人遗憾的是,然而R感到不安并说(表(因子(df,levels = list)不是一个函数。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

你几乎就在那里,正如错误所说,你只需要在apply中定义功能

apply(df, 2, function(u) table(factor(u, levels=vec)))
#  V1 V2 V3
#x  2  1  0
#y  1  1  1
#z  0  1  2

您还可以使用lapply函数迭代data.frame的列:

do.call(rbind,lapply(df, function(u) table(factor(u, levels=vec))))
#   x y z
#V1 2 1 0
#V2 1 1 1
#V3 0 1 2

请注意,命名向量“列表”确实具有误导性。 list此外还是R langage的关键字,因此我将您的矢量重命名为“vec”。

数据:

vec = c("x", "y", "z")

df = structure(list(V1 = structure(c(1L, 1L, 2L), .Label = c("x", 
"y"), class = "factor"), V2 = structure(c(2L, 1L, 3L), .Label = c("x", 
"y", "z"), class = "factor"), V3 = structure(c(1L, 2L, 2L), .Label = c("y", 
"z"), class = "factor")), .Names = c("V1", "V2", "V3"), row.names = c(NA, 
-3L), class = "data.frame")

答案 1 :(得分:0)

这是我的解决方案,使用plyrs rbind.fill

df <- read.table(header = TRUE, text = '   V1   V2   V3
x    y    y
x    x    z
y    z    z')

require(plyr)
out <- rbind.fill(lapply(df, function(x) as.data.frame.matrix(t(table(x)))))
out[is.na(out)] <- 0
out
#   x y z
# 1 2 1 0
# 2 1 1 1
# 3 0 1 2