2016-01-21 73 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 

的結果是列表的列表,每個子列表提供每行的所有分組的計數。這種相當普遍的問題是什麼值在行中。