我在数据框中有一列,其中包含由0, 1, 2
组成的序列(从一行到下一行的长度不均匀)。 (字符串不一定需要是数字;它们表示整个句子中音节的压力程度。)最小(非常简化)示例:
> df
a b
foo 0100101
bar 01201
我需要的是一个数据帧,它在该列中提供每个2位或3位组合(数字可以自己出现,例如00
)以及整个数据帧中每个组合的总数。 (每行的计数也很不错,但我担心这需要一些重塑,现在不是我的目标。)缩写的预期结果:
> output
combo count
00 1
01 5
10 2
...
001 1
010 2
...
等等。我在str_count
尝试了很多变种而没有成功。
答案 0 :(得分:1)
<强> 1 强>
为df$b
中的字符串获取所有2或3个元素组合,然后使用table
计算其频率
table(unlist(lapply(c(2, 3),
function(i) lapply(df$b,
function(x) sapply(1:(nchar(x) - (i - 1)),
function(j) substr(x, j, j + i - 1))))))
# 00 001 01 010 012 10 100 101 12 120 20 201
# 1 1 5 2 1 2 1 1 1 1 1 1
<强> 2 强>
使用expand.grid
获取0
,1
和2
的2和3个元素的所有组合。然后,使用gregexpr
计算df$b
sapply(c(do.call(paste0, (expand.grid(0:2, 0:2))),
do.call(paste0, (expand.grid(0:2, 0:2, 0:2)))),
function(x){
temp = unlist(gregexpr(pattern = x, text = df$b))
length(temp[temp != -1])
})
# 00 10 20 01 11 21 02 12 22 000 100 200 010 110 210 020 120 220 001
# 1 2 1 5 0 0 0 1 0 0 1 0 2 0 0 0 1 0 1
#101 201 011 111 211 021 121 221 002 102 202 012 112 212 022 122 222
# 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
数据强>
df = structure(list(a = c("foo", "bar"), b = c("0100101", "01201")), .Names = c("a",
"b"), row.names = c(NA, -2L), class = "data.frame")