如何计算R中数据框中特定值的数量?

时间:2017-12-10 13:06:04

标签: r dataframe

我有一个数据帧df:

a b c
1 5 5
2 3 5
3 3 5
3 3 3
3 3 2
4 2 2
1 2 2

我想计算我连续多少3,例如,我该怎么办? 例如,第2行= 1,第3行= 2等。 请指教。

3 个答案:

答案 0 :(得分:2)

您可以使用applytable。输出是一个列表,为您提供每行唯一元素的计数。 (如果您感兴趣,将MARGIN设置为适用于2将为您提供每列的输出。)

更新:由于其他人提供的解决方案产生更多"有序"同时输出,我已经为此目的使用data.table::rbindlist修改了我的方法。

#I have skipped some of the last rows of your example
data <- read.table(text = "
                   a b c
                   1 5 5
                   2 3 5
                   3 3 5
                   3 3 3
                   ", header = T, stringsAsFactors = F)

apply(data, 1, table)
# [[1]]
# 1 5 
# 1 2 
# [[2]]
# 2 3 5 
# 1 1 1 
# [[3]]
# 3 5 
# 2 1 
# [[4]]
# 3 
# 3 

#Update: output in more ordered fashion 
library(data.table)
rbindlist(apply(data, 1, function(x) as.data.table(t(as.matrix(table(x)))))
          ,fill = TRUE
          ,use.names = TRUE)
#     1  5  2  3
# 1:  1  2 NA NA
# 2: NA  1  1  1
# 3: NA  1 NA  2
# 4: NA NA NA  3

#if necessary NA values might be replaced, see, e.g.,
##https://stackoverflow.com/questions/7235657/fastest-way-to-replace-nas-in-a-large-data-table

答案 1 :(得分:2)

如果您想计算所有值,@ ManuelBickel的答案是好的。如果你真的只想知道有多少3个,这可能会更简单。

rowSums(data==3)
[1] 0 1 2 3

答案 2 :(得分:2)

如果您希望以更有序的方式返回计数

set.seed(1)
m <- matrix(sample(c(1:3, 5), 15, replace=TRUE), 5, dimnames=list(LETTERS[1:5]))
m
#   [,1] [,2] [,3]
# A    2    5    1
# B    2    5    1
# C    3    3    3
# D    5    3    2
# E    1    1    5

u <- sort(unique(as.vector(m)))
r <- sapply(setNames(u, u), function(x) rowSums(m == x))
r
#   1 2 3 5
# A 1 1 0 1
# B 1 1 0 1
# C 0 0 3 0
# D 0 1 1 1
# E 2 0 0 1