【问题标题】:Calculate value with for() and if()使用 for() 和 if() 计算值
【发布时间】:2020-10-11 13:20:23
【问题描述】:

我对 R 很陌生。我有一个包含 100 个字段的数据框,每个字段包含 65 种植物(6500 行)。我想为 100 个字段中的每一个计算一个值,应该是:

value (field_1) = (plant_cover1 * plant_trait1 + plant_cover2 * plant_trait2 + ......)/(plant_cover1 + plant_cover2 + .....)

Plant_cover1:物种 1 的垂直密度值 Plant_trait1:物种 1 的 slamean 值

我尝试了以下方法,但我被卡住了。我也收到错误“条件的长度> 1,只会使用第一个元素”。

for(i in levels(NPT$Feltnummer)) {
        for (i in levels(NPT$Artsnavn_dansk)) {
                if(NPT$Vertikal_densitet>0 & NPT$slamean>0) {
                       return((NPT$vertikal_densitet*NPT$slamean)/NPT$Vertikal_densitet)
                        }sum()}Return()}

我将如何计算 100 个值?我希望你能帮忙。

这是我的一些数据(2 个字段):

 dput(head(NPT, 130))

structure(list(Feltnummer = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), Vertikal_densitet = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.64, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 6.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.24, 
0.48, 0, 0, 0, 0, 0.36, 0.44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0.64, 0.64, 0, 0, 0, 0, 0.04, 0.84, 0, 0, 0, 0.32, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), slamean = c(54.015, 
0, 29.3766666666667, 0, 0, 0, 29.5933333333333, 20.63, 0, 0, 
36.33, 19.8166666666667, 0, 0, 16.4233333333333, 5.95, 9.35, 
27, 12.82, 39.27, 31.6425, 15.3433333333333, 0, 20.4775, 11.37, 
22.8, 28.185, 0, 0, 12.41, 4.92, 18.99, 41.47, 32.05, 0, 19.1875, 
0, 7.61, 0, 0, 0, 15.0425, 0, 15.586, 0, 0, 8.425, 34.0825, 0, 
13.71, 13.55, 0, 24.87, 0, 17.97, 13.96, 18.85, 0, 0, 29.13, 
12.87, 10.11, 30.11, 0, 0, 54.015, 0, 29.3766666666667, 0, 0, 
0, 29.5933333333333, 20.63, 0, 0, 36.33, 19.8166666666667, 0, 
0, 16.4233333333333, 5.95, 9.35, 27, 12.82, 39.27, 31.6425, 15.3433333333333, 
0, 20.4775, 11.37, 22.8, 28.185, 0, 0, 12.41, 4.92, 18.99, 41.47, 
32.05, 0, 19.1875, 0, 7.61, 0, 0, 0, 15.0425, 0, 15.586, 0, 0, 
8.425, 34.0825, 0, 13.71, 13.55, 0, 24.87, 0, 17.97, 13.96, 18.85, 
0, 0, 29.13, 12.87, 10.11, 30.11, 0, 0)), row.names = c(NA, -130L
), class = c("tbl_df", "tbl", "data.frame"))

  

  str(NPT)

tibble [6,500 x 3] (S3: tbl_df/tbl/data.frame)
 $ Feltnummer       : num [1:6500] 1 1 1 1 1 1 1 1 1 1 ...
 $ Vertikal_densitet: num [1:6500] 0 0 0 0 0 0 0 0 0 0 ...
 $ slamean          : num [1:6500] 54 0 29.4 0 0 ...

【问题讨论】:

  • 您能否使用 dput() 分享您的数据框的可重现示例
  • 当我使用 dput(NPT) 时,我只会得到一个很长的 0 和 1 和 NA 输出,而且放在这里太长了。这是你的意思吗?当我使用 str(NPT) 时,我得到以下信息: > str(NPT) ... $ Artsnavn_dansk : Factor w/ 65 levels "aflangbladet vandaks",..: 1 1 ... $ Feltnummer : Factor w/ 100 levels " 1","2","3","4",..: 1 2 3 ... $ Vertikal_densitet : num [1:6500] 0 .. :::
  • 是丹麦语,所以 $Artsnavn_dansk 是物种名称,$Feltnummer 是字段编号
  • 放在这里还是太长了。这是输出的顶部: > dput(head(NPT)) structure(list(Artsnavn_dansk = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("aflangbladet vandaks", "almindelig engelsød”、“almindelig hvene”、“almindelig hønsetarm”、“almindelig kohvede”、“almindelig kongepen”、“almindelig kællingetand”、“almindelig s
  • 当然。谢谢。我刚刚编辑了问题。

标签: r for-loop if-statement


【解决方案1】:

感谢您发布数据。看起来您有很多列未在计算中使用。我们喜欢使用“最小可重现示例”:

How to make a great R reproducible example

感谢您发布精简后的数据集。

使用 R,您经常会发现您在没有循环的情况下做了很多事情。在这种情况下,有几种不同的方法可以以这种方式工作。

您可以尝试使用tidyverse(在这种情况下,只需要dplyr 包)。

从NPT 数据开始,您将group_by 字段,然后filter 输出Vertikal_densitet 和slamean 都为零的行(如果这是预期的)。

library(dplyr)

NPT %>%
  group_by(Feltnummer) %>%
  filter(Vertikal_densitet > 0 & slamean > 0) %>%
  summarise(value = sum(Vertikal_densitet * slamean) / sum(Vertikal_densitet))

鉴于您的新示例数据,我得到:

  Feltnummer value
       <dbl> <dbl>
1          1 11.6 
2          2  9.84

【讨论】:

  • 这看起来完全正确!我使用 dplyr 并尝试运行它,但我的输出如下所示: value 1 NaN 我没有所有物种的值,所以我可能必须管理缺失的值?
  • 当我尝试第一个示例时,它可以工作,但我得到不同的输出:值 1 56 当我尝试第二个示例时,我收到此错误:> NPT_N 0 是否不是固有的盖的总和也应该> 0?我在只有必要列的数据帧上尝试了您的代码,但它返回相同的错误:值 1 NaN
  • 另外 - 在尝试第一个示例时 NPT2 有 0 obs。 5 个变量。这似乎是错误的。但我不知道为什么会这样。
  • 我想我在加载多个包时遇到了问题。现在我得到和你一样的输出:52.7 和 57.2。快乐的时光。我将尝试摆弄数据并稍后报告。非常感谢您迄今为止的帮助!
  • 现在它非常适合您的数据示例,但是当我尝试使用我的数据框时,我得到了这个:summarise() ungrouping output (override with .groups argument) # A tibble: 0 x 2 # ... 有 2 个变量:Feltnummer , value 在我看来,我得到了两列“feltnummer”和“value”,但没有实际值的行。是因为我使用“read_excel”来导入我的数据框吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2019-07-08
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多