2014-05-23 33 views
1

我有一個的大數據幀(DF),看起來像這樣:將rowwise計數的值發生爲新變量,如何在R中使用dplyr來做到這一點?

structure(list(var1 = c(1, 2, 3, 4, 2, 3, 4, 3, 2), var2 = c(2, 
3, 4, 1, 2, 1, 1, 1, 3), var3 = c(4, 4, 2, 3, 3, 1, 1, 1, 4), 
    var4 = c(2, 2, 2, 2, 3, 2, 3, 4, 1), var5 = c(4, 4, 2, 3, 
    3, 1, 1, 1, 4)), .Names = c("var1", "var2", "var3", "var4", 
"var5"), row.names = c(NA, -9L), class = "data.frame") 

    var1 var2 var3 var4 var5 
1 1 2 4 2 4 
2 2 3 4 2 4 
3 3 4 2 2 2 
4 4 1 3 2 3 
5 2 2 3 3 3 
6 3 1 1 2 1 
7 4 1 1 3 1 
8 3 1 1 4 1 
9 2 3 4 1 4 

現在我需要算值橫行的發生,使計數的新變量。這應該是結果:

var1 var2 var3 var4 var5 n_1 n_2 n_3 n_4 
1 1 2 4 2 4 1 2 0 2 
2 2 3 4 2 4 0 2 1 2 
3 3 4 2 2 2 0 3 1 1 
4 4 1 3 2 3 1 1 2 1 
5 2 2 3 3 3 0 2 3 0 
6 3 1 1 2 1 3 1 1 0 
7 4 1 1 3 1 3 0 1 1 
8 3 1 1 4 1 3 0 1 1 
9 2 3 4 1 4 1 1 1 2 

正如你可以看到變量N_1顯示1的的rowcounts,N_2 2的的行數等

我嘗試了一些dplyr功能(因爲我喜歡他們的速度),但還沒有成功。我知道這是肯定醜陋的代碼:-),但我approache會是這樣這樣:

newdf <- mutate(rowwise(df, n_1 = sum(df==1)) 

沒有人對如何處理這個問題的想法? 非常感謝提前!

回答

3

這使用rowwise()do()dplyr但它是絕對醜陋的。

不確定是否有某些東西可以從中修改,這樣您就可以直接獲得數據幀輸出,如@https://github.com/hadley/dplyr/releases上所示。

interim_res <- df %>% 
        rowwise() %>% 
        do(out = sapply(min(df):max(df), function(i) sum(i==.))) 

interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.) 

然後得到想要的結果:

res <- cbind(df,interim_res) 
+0

謝謝!這是一個使用dplyr的工作解決方案(根據我的具體問題)。 – rdatasculptor

1

這是使用基本功能

dd <- t(apply(df, 1, function(x) table(factor(x, levels=1:4)))) 
colnames(dd) <- paste("n",1:4, sep="_") 
cbind(df, dd) 

只需使用table命令在您data.frame行從1-4中得到的每個值的計數的解決方案。

1

下面是使用qdapTools包的方法:

library(qdapTools) 

data.frame(dat, setNames(mtabulate(split(dat, id(dat))), paste0("n_", 1:4))) 

## var1 var2 var3 var4 var5 n_1 n_2 n_3 n_4 
## 1 1 2 4 2 4 1 2 0 2 
## 2 2 3 4 2 4 0 2 1 2 
## 3 3 4 2 2 2 0 3 1 1 
## 4 4 1 3 2 3 1 1 2 1 
## 5 2 2 3 3 3 0 2 3 0 
## 6 3 1 1 2 1 3 1 1 0 
## 7 4 1 1 3 1 3 0 1 1 
## 8 3 1 1 4 1 3 0 1 1 
## 9 2 3 4 1 4 1 1 1 2 
相關問題