计算每行的列方式和&为dataframe中的每个值添加新列

时间:2017-07-13 14:55:50

标签: r

我的数据框如下

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

我有这么多行。 Dataframe只有这四个值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 个答案:

答案 0 :(得分: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

或者我们可以使用apply中的base R来循环遍历行

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

答案 1 :(得分: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))