2014-05-23 38 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 
相关问题