2016-01-21 47 views
0

当列是因子时,您如何计算按行显示的次数“B”或“C”?我知道你如何使用rowSums()如果数字,但我没有看到如何计算因子水平。当“x”是一个因子时,按行计算“x”出现的次数

有:

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

的简化版本可能是'rowSums(DF ==“C” | df ==“B”)'。一个丑陋的,但更一般的可以是'''colSums(应用(df,1,'%in%',LETTERS [2:3]))''' –

+0

请阅读'?rowSums'关于参数'x':包含数字,复数,整数**或逻辑值**的数组,包含数字,复数,整数**还推荐阅读:'?TRUE':“在需要数字值的上下文中,逻辑向量被强制为整数向量” – Henrik

+0

ok ,谢谢,我认为我的实际使用案例抱怨你的方法@DavidArenburg,因为我在数据框中有一些日期列 –

回答

1

从@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 
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 

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

相关问题