【发布时间】: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