[英]Putting rowwise counts of value occurences into new variables, how to do that in R with dplyr?
我有一個看起來像這樣的大數據框(df):
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的行計數,n_2顯示2的行計數,依此類推。
我嘗試了一些dplyr函數(因為我喜歡它們的速度),但尚未成功。 我知道這絕對是丑陋的代碼:-),但是我的方法是這樣的:
newdf <- mutate(rowwise(df, n_1 = sum(df==1))
有誰知道如何處理這個問題? 提前謝謝了!
它使用rowwise()
和do()
從dplyr
但它肯定難看。
不知道是否可以對此進行修改,以便直接獲得data.frame輸出,如@ 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)
這是使用基本功能的解決方案
dd <- t(apply(df, 1, function(x) table(factor(x, levels=1:4))))
colnames(dd) <- paste("n",1:4, sep="_")
cbind(df, dd)
只需在data.frame
各行中使用table
命令即可獲取1-4中每個值的計數。
這是使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.