我想创建一个表或一个新数据框,以显示原始数据框中的每一列(其中有很多列),该特定值的序列出现了多少次。例如,如果我具有以下数据框:
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函数在单个向量上找到了解决方案,但我不知道如何针对具有多列的整个数据帧进行扩展,并获得具有顺序计数的新表或数据帧,例如在上表中。谢谢!
答案 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()