r - 值之间的字符串值的计数

标签 r dplyr count

我有一个简单的数据框,它是一组 ID 列和 0 或 1 的值,例如:

data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))

  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  1  1  0  1  0  0  1  1  1   0
2  0  0  0  1  0  1  0  0  1   0
3  0  1  1  1  1  0  1  1  1   1
4  0  0  0  1  1  1  1  1  1   0
5  1  0  1  0  1  1  0  1  1   0
6  0  1  1  1  1  1  0  1  1   1

我想编写一个代码或循环,为每一列计算 0 的数量,直到遇到另一个 1,然后继续沿列向下。因此,理想情况下,输出是具有相同 ID 列头和计数列表的新数据框:

  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  3  1  2  1  2  1  1  1  NA  2
2  1  2  1  1  NA 1  2  NA NA  2

   

我不知道如何做到这一点,而且行结果可能有不同的长度。如果每一列都必须创建一个新的数据框,那就没问题了。

最佳答案

这是一个基本的 R 解决方案。我使用了尺寸为 10 的示例,而不是尺寸为 1000 的示例,因此我们可以实际看到发生了什么并确保它看起来正确。

set.seed(47)
d = data.frame(replicate(10,sample(0:1,10,rep=TRUE)))
d
#    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1   0  0  0  0  0  0  1  1  0   0
# 2   0  1  0  1  0  0  0  0  0   0
# 3   1  1  1  0  1  0  0  0  1   0
# 4   0  0  0  0  0  1  1  1  1   1
# 5   1  1  0  1  0  0  1  1  1   0
# 6   0  1  1  1  1  1  1  1  0   1
# 7   1  1  0  0  1  0  0  1  1   0
# 8   0  0  1  0  1  0  1  0  0   0
# 9   0  0  0  1  1  1  0  0  1   1
# 10  1  1  1  0  1  0  1  1  0   0

results = lapply(d, function(x) with(rle(x), lengths[values == 0]))
max_length = max(lengths(results))
results = lapply(results, function(x) {length(x) = max_length; x})
results = do.call(cbind, results)
results
#      X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# [1,]  2  1  2  1  2  3  2  2  2   3
# [2,]  1  1  2  2  2  1  1  2  1   1
# [3,]  1  2  1  2 NA  2  1 NA  1   2
# [4,]  2 NA  1  1 NA  1 NA NA  1   1

关于r - 值之间的字符串值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64064905/

相关文章:

r - 如何根据另一个数据框中存在的列过滤到新的数据框?

r - 具有多个条件的内连接 r 数据表

r - NSE lazyeval::lazy 与引用变量名时的替换

R 用 tidyr 扩展多列

r - 使用 tidyverse 获取 Nest 的描述性结果,然后计算我们有多少个观察结果符合这些标准

r - 按年份过滤等于或小于阈值

mysql - 为什么此代码能够在 HAVING 中使用来自 SELECT 的别名?

r - 使用with和intracluster相关性生成模拟数据

ios - 如何计算 CoreData 对象的唯一日期?

Jquery选择器: Count element with attribute on the second tr