我是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函数,但它正在返回NAs。
非常感谢。
答案 0 :(得分: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。