2017-07-13 65 views
1

爲每個值添加新列我有數據幀如下計算逐列和每一行與在數據幀

A  B C D 
11 11 33 44 
11 11 22 33 
22 22 33 44 
22 33 44 11 

我有這樣的數千行。數據幀只有這四個值11,22,33,44。

沒有NA值或空值

我要帶數爲每跨越每一行這些價值觀,並在新列添加。

我想輸出如下 -

A  B C D 11 22 33 44 
11 11 33 44 2 0 1 1 
11 11 22 33 2 1 1 0 
22 22 33 44 0 2 1 1 
22 33 44 11 1 1 1 1 

目前我試圖 作爲

count.22 <- sapply(dff,FUN=function(x,dff){sum(dff[,2]==22)},dff) 

,但它不工作。

回答

2

我們可以使用mtabulate

library(qdapTools) 
df2 <- cbind(df1, mtabulate(as.data.frame(t(df1)))) 
row.names(df2) <- NULL 
df2 
# A B C D 11 22 33 44 
#1 11 11 33 44 2 0 1 1 
#2 11 11 22 33 2 1 1 0 
#3 22 22 33 44 0 2 1 1 
#4 22 33 44 11 1 1 1 1 

或者我們可以使用applybase R遍歷行

cbind(df1, t(apply(df1, 1, function(x) table(factor(x, levels = c(11, 22, 33, 44)))))) 
2

如果您data.frame是x你可以按如下做:

vals <- c(11,22,33,44) 
cbind(x, setNames(lapply(vals, function(v) rowSums(x == v)), vals)) 
# A B C D 11 22 33 44 
#1 11 11 33 44 2 0 1 1 
#2 11 11 22 33 2 1 1 0 
#3 22 22 33 44 0 2 1 1 
#4 22 33 44 11 1 1 1 1 

這樣您不會遍歷行,而是要檢查唯一值。

類似的版本直接分配將

x[,as.character(vals)] <- lapply(vals, function(v) rowSums(x == v))