R语言 如何让循环函数自动遍历每一行?

vwhgwdsa  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(106)

x1c 0d1x的数据
我正在处理一个具有45行和6列的数据集(我已经删除了2个不相关的)。我试图创建一个函数,将通过每一行和计算辛普森的多样性(使用列值)。公式为:D = Σni(ni-1) / N(N-1),其中n是每列中的值,N是一行中所有列的值加在一起-希望这是有意义的,实际的等式对我的问题并不重要。
我有一段代码可以遍历各行,在这个循环中还有一个循环可以遍历一行中的所有列,并计算它们的丰度。我在循环结束时的目标是将它们放在一起,放入我创建的向量“simp”中,以保存每行的所有答案(simpson多样性)。这个函数应该是通用的,所以它可以用于任何数据集。
正如你在我的代码和结果中所看到的,vector显示了所有的行,但是只有第一行有答案。有人知道如何使这个函数更加自动化,这样它就会遍历每一行并将答案放入我的vector中吗?编辑-它需要像我的作业一样,我不能使用预先存在的simpson多样性函数:(

#My code: (killdat is the dataset I am working with, with the two columns removed).
#simp is my empty vector to hold answers
killdat=select(killarney, -Lake, -Status)

test=function(x){
  simp=vector(mode="logical", length=nrow(Df))
  for(j in 1:nrow(Df)){
    for(i in 1:ncol(Df)){
      abun=(Df[j,i])*(Df[j,i]-1)
      n=Df[j,]
    }
    N=sum(n)
    num=sum(abun)
    den=N*(N-1)
    simp[j]=1-(num/den);return(simp)
  }}

test(killdat)

#my output:
[1] 0.9396795 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[13] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[25] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[37] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

字符串

weylhg0b

weylhg0b1#

创建一些与您的描述相似的数据。

library(tidyverse)
library(abdiv)

killarney <-
  tibble(
    id = 1:45,
    var1 = sample(1:100, 45),
    var2 = sample(1:100, 45),
    var3 = sample(1:100, 45),
    var4 = sample(1:100, 45),
    var5 = sample(1:100, 45),
    var6 = sample(1:100, 45)
  )

killarney
#> # A tibble: 45 × 7
#>       id  var1  var2  var3  var4  var5  var6
#>    <int> <int> <int> <int> <int> <int> <int>
#>  1     1    30     6     8    92    30   100
#>  2     2    20    99     2    34    29    78
#>  3     3    24     3    37    96    26    69
#>  4     4    33    50     4   100    56    77
#>  5     5    73    59    70    70    64    55
#>  6     6    12    14    61    29    55    14
#>  7     7    70    97    81    82    93    80
#>  8     8    52     2    57    66    13    53
#>  9     9    57    81    86    94    16    98
#> 10    10    37    40    18    71    75    17
#> # ℹ 35 more rows

字符串

  1. abdiv包有一个simpson()函数或者您可以实现自己的自定义函数。
    1.与对行进行操作不同,先对数据进行pivot_longer()操作,然后对分组的data.frame进行操作更容易。
# custom simpson function
simpson_func <- 
  function(x) {
    N <- sum(x)
    D = sum(x * (x - 1)) / (N * (N - 1))
    1 - D
}

killarney |>
  pivot_longer(-id) |>
  group_by(id) |>
  summarise(simp = simpson_func(value))
#> # A tibble: 45 × 2
#>       id  simp
#>    <int> <dbl>
#>  1     1 0.715
#>  2     2 0.736
#>  3     3 0.748
#>  4     4 0.781
#>  5     5 0.834
#>  6     6 0.767
#>  7     7 0.833
#>  8     8 0.778
#>  9     9 0.809
#> 10    10 0.789
#> # ℹ 35 more rows

相关问题