计算数据帧中多个列的特定值的序列数

时间:2019-05-31 01:27:22

标签: r count sequence

我想创建一个表或一个新数据框,以显示原始数据框中的每一列(其中有很多列),该特定值的序列出现了多少次。例如,如果我具有以下数据框:

x <- data.frame("Red" = c("a", "b", "a", "a", "c", "d"), "Blue" = c("b", "a", "a", "a", "a", "a"), "Green" = c("a", "a", "b", "a", "b", "a"))

我想知道,对于每种颜色(红色,蓝色和绿色),“ a”值的运行次数发生了多少次(即,在它被诸如b或c的另一个值中断之前)

正确的答案如下:

     Color a_sequences
1   Red  2
2  Blue  1
3 Green  3

我在此站点上使用rle函数在单个向量上找到了解决方案,但我不知道如何针对具有多列的整个数据帧进行扩展,并获得具有顺序计数的新表或数据帧,例如在上表中。谢谢!

4 个答案:

答案 0 :(得分:1)

f = function(v, ch) sum(rle(as.character(v))$values == ch)
sapply(x, f, 'a')
# Red  Blue Green 
# 2     1     3 

答案 1 :(得分:1)

这里是tidyverse的一个选项,其中我们gather变成“长”格式,按“颜色”分组,而运行长度id(rleid)为“值” ,filter的“值”元素为“ a”,然后按“颜色”分组,得到不同的“ grp”元素的数量

library(tidyverse)
library(data.table)
gather(x, color, value) %>% 
   group_by(color, grp = rleid(value)) %>% 
   filter(value == "a") %>% 
   group_by(color) %>%
   summarise(n = n_distinct(grp))
# A tibble: 3 x 2
#  color     n
#  <chr> <int>
#1 Blue      1
#2 Green     3
#3 Red       2

或带有summarise_all的选项

x %>% 
   summarise_all(list(~ n_distinct(setdiff((. == 'a') * rleid(.), 0)))) %>% 
   as.list %>% 
   enframe %>%
   unnest
# A tibble: 3 x 2
#  name  value
#  <chr> <int>
#1 Red       2
#2 Blue      1
#3 Green     3

答案 2 :(得分:1)

这是另一个想法。我们可以合并并折叠所有字符串,拆分非a的字符串,然后计算包含a的元素的数量。 result2是最终结果。

result <- sapply(x, function(x) {
  x2 <- as.character(x)
  y <- paste0(x2, collapse = "")
  z <- strsplit(y, "[^a]")[[1]]
  return(sum(grepl("a", z)))
})

result2 <- data.frame(Color = names(result), a_sequence = unname(result))
result2
#   Color a_sequence
# 1   Red          2
# 2  Blue          1
# 3 Green          3

答案 3 :(得分:0)

在R底下,您可以这样做:

 f = as.character(unique(unlist(x))) 
 t(sapply(x,function(y)table(factor(rle(as.character(y))$values,f))))
      a b c d
Red   2 1 1 1
Blue  1 1 0 0
Green 3 2 0 0

似乎您的整个数据集都有其影响,因此使用了代码as.character()