我的数据框如下
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)
但它不起作用。
答案 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))