在两个不同的列中满足两个条件的观察值的百分比(以r表示)

时间:2019-06-27 15:03:35

标签: r

我有一个很棒的数据库,其中列是物种存在和采矿项目存在(存在= 1,存在= 0),行是地理分布位置(像素)。 我想获得关于specie1 = 1的specie1 = 1和挖矿项目= 1时的像素百分比。我有100多种,所以我需要一种循环以提高效率

我试图用for做一个循环,但是我不知道什么是“ i”。

这是我想做的一个例子

x <- data.frame("dog" = c(1,1,0,0,1,1), "cat" = c(1,0,0,0,1,1), 
+                 "trap" = c(1,1,0,1,0,1))
> x
  dog cat trap
1   1   1    1
2   1   0    1
3   0   0    0
4   0   0    1
5   1   1    0
6   1   1    1
> dog <- sum(x$dog==1 & x$trap==1)/sum(x$dog==1)
> dog
[1] 0.75
> cat <- sum(x$cat==1 & x$trap==1)/sum(x$cat==1)
> cat
[1] 0.6666667

我想以最少的步骤获得我所有100种动物的答案:

[1] dog  0.75
[2] cat  0.6666

2 个答案:

答案 0 :(得分:0)

一个选项正在使用colSums

colSums(x[-3] * x[,3])/colSums(x[-3])
#    dog       cat 
#0.7500000 0.6666667 

或与sapply

sapply(x[1:2], function(y)  sum(y ==1 & x[,3] == 1)/sum(y ==1))
#      dog       cat 
#0.7500000 0.6666667 

答案 1 :(得分:0)

您可以在此处使用*apply()函数,例如sapply()

x <-
  data.frame(
    "dog" = c(1, 1, 0, 0, 1, 1),
    "bird" = c(1, 1, 0, 0, 0, 0),
    "cat" = c(1, 0, 0, 0, 1, 1),
    "trap" = c(1, 1, 0, 1, 0, 1)
  )
sapply(x[, 1:(ncol(x)-1)], function(i) sum(i == 1 & x$trap == 1) / sum(i == 1))
#>       dog      bird       cat 
#> 0.7500000 1.0000000 0.6666667

reprex package(v0.3.0)于2019-06-27创建