Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将值出现的行计数放入新变量中,如何使用dplyr在R中实现这一点?_R_Dplyr - Fatal编程技术网

将值出现的行计数放入新变量中,如何使用dplyr在R中实现这一点?

将值出现的行计数放入新变量中,如何使用dplyr在R中实现这一点?,r,dplyr,R,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"

我有一个大数据帧(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))

newdf这是一个使用基函数的解决方案

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

dd这是一个使用基函数的解决方案

dd <- t(apply(df, 1, function(x) table(factor(x, levels=1:4))))
colnames(dd) <- paste("n",1:4, sep="_")
cbind(df, dd)
dd这使用了
dplyr
中的
rowwise()
do()
,但它确实很难看

不确定是否有可以修改的内容,以便直接获得data.frame输出,如@所示

临时资源%
行()
do(out=sapply(min(df):max(df),函数(i)和(i==))
临时\u res%do.call(rbind,.%>%as.data.frame(.)
然后,为了获得预期结果:

res <- cbind(df,interim_res)
res这使用了
dplyr
中的
rowwise()
do()
,但它确实很难看

不确定是否有可以修改的内容,以便直接获得data.frame输出,如@所示

临时资源%
行()
do(out=sapply(min(df):max(df),函数(i)和(i==))
临时\u res%do.call(rbind,.%>%as.data.frame(.)
然后,为了获得预期结果:

res <- cbind(df,interim_res)

res以下是使用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

以下是使用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

谢谢这是一个使用dplyr的有效解决方案(根据我的具体问题)。谢谢!这是一个使用dplyr的有效解决方案(根据我的具体问题)。