1

我是 R 的新手。关于这个问题,我一直在 Stack Overflow,也许没有正确搜索我想要的答案。

我有一个矩阵,其具有独特的二元关系作为行和年作为列。如果两个人在那一年没有互动,则单元格填充为 0,如果他们有互动,则填充为 1。

我正在尝试计算每个单元格的百分比 - 1 出现的次数相对于第一次出现 1 后的条目数。通俗地说,这就是两个人自从相遇以来每年互动的频率。

连续第一次出现 1 总是 100%。例如,下例中的 B 行:

 V1 V2 V3 V4
A 0  0  1  0
B 1  1  0  0

变成

 100 100 66 50

我已经计算了矩阵每个单元格的累积和

data <- matrix(sample(0:1,5*4,rep=T),4)
test<-t(apply(data,1,cumsum))

然后我的想法是创建一个类似于下面的函数,但我坚持使用什么表达式作为分母(下面只删除第一次出现之前的条目数)。我不太清楚如何对未来的情况进行子集化,或者直接引用矩阵的列索引。

mm<-function(x){(x)/(ncol(data)-(which(x>0)[1]))} 
tmp_int<-apply(data, 1:2, mm) 

还是有更简单的方法来做到这一点?我尝试使用 ecdf 函数,但它返回 NA。

非常感谢。

4

1 回答 1

1
data <- matrix(sample(0:1, 5 * 4, rep = TRUE), 4)

f <- function(m) t(apply(m, 1, cumsum))
f(data) / (f(f(data) >= 1) + (f(data) == 0)) * 100
#      [,1] [,2]     [,3]     [,4] [,5]
# [1,]  100   50 66.66667 75.00000   60
# [2,]  100  100 66.66667 50.00000   40
# [3,]    0  100 50.00000 33.33333   25
# [4,]  100   50 66.66667 50.00000   60

f是您已经拥有的,f(f(data) >= 1)为元素除法提供了几乎合适的分母,同时f(data) == 0确保我们不会除以 0。

于 2016-04-03T22:59:14.703 回答