当“x”是一个因子时,计算“x”按行显示的次数

时间:2016-01-21 20:40:44

标签: r

当列是因子时,您如何计算“B”或“C”按行显示的次数?我得到了如果使用rowSums()数字的方法,但我没有看到如何计算因子水平。

有:

df <- data.frame(v1=factor(c("A", "A", "A", "B")),
                 v2=factor(c("A", "B", "B", "B")),
                 v3=factor(c("C", "A", "B", "B")))

想要:

# 1 1 2 3

更新

rowSums()因实际用例而失败,因为我的数据框有日期列。这是一个更好的玩具示例:

df2 <- data.frame(v1=factor(c("A", "A", "A", "B")),
                  v2=factor(c("A", "B", "B", "B")),
                  v3=factor(c("C", "A", "B", "B")),
                  v4=as.Date("1998-12-17"))

2 个答案:

答案 0 :(得分:2)

来自@DavidArenburg:

rowSums(df == "C" | df == "B")

这适用于原始df示例。我的实际用例在数据框中有日期列,因此失败了。基于@Frank的想法的修改方法:

rowSums(df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="B" | df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="C", na.rm=T)

可能是一种更清晰的编码方式,但它有效:

#[1] 1 1 2 3

答案 1 :(得分:0)

使用您的数据框并假设您对第1行到第4行感兴趣 试试这个:

mapply(function(x) {tapply(as.vector(as.matrix(df[x,])), as.vector (as.matrix(df[x,])), length)},  1:4)

结果是:

[[1]]

A C 

2 1 

[[2]]

A B

2 1 

[[3]]

A B 

1 2 

[[4]]

B 

3 

结果是列表,每个子列表提供每行的所有分组的计数。这个相当普遍的问题是关于行中的值。