我有一个包含植物叶长和宽度数据的两列数据框。
对于 2019 年,我有多种数据。一些数据点只有长度和面积测量值。其他一些数据点具有所有三个测量值。
根据这些数据,我能够计算出一个转换系数。在 2020 年,我只有长度和宽度测量值。使用转换因子,我想计算 2020 年的面积并将其添加到叶面积列中,而不覆盖 2019 年的任何面积测量值
df_all <- df_all%>% mutate(rep_leaf_length*rep_leaf_width * 0.790590)
在我意识到我不知道如何到达我想要的地方之前,这是我的第一个起点。
你们有没有想法如何进行乘法并将结果添加到现有列中,但仅限于 2020 年,或者如果 NA 在面积列中且尚未存在面积测量值。
Year rep_leaf_length rep_leaf_width rep_leaf_area
2019 37.400 NA NA
2019 21.036 8.080 132.914
2019 29.147 2.331 NA
2020 16.600 4.00 NA
2020 21.600 2.2 NA
非常感谢简
答案 0 :(得分:0)
我认为您的意思是您想使用那一年的(测量的)叶长和叶宽来推断 2020 年的(未测量的)叶面积。然而,叶子面积不是宽度和长度的简单乘积,因为叶子不是矩形的。幸运的是,你有一些 2019 年的观察结果,其中长度、宽度和面积都被测量了。这意味着如果您将长度 * 宽度与完整 2019 年观察的实际面积进行比较,您将获得实际面积与(长度 * 宽度)的比率。由于叶子可能具有相对固定的形状,因此可以使用该比率乘以 2020 年的(长度 * 宽度)值以得出估计面积。
假设我已经正确理解了您的意图,我们可以计算出 2019 年实际面积与(宽 * 长)的比率,如下所示:
library(dplyr)
ratio <- df_all %>%
filter(Year == 2019) %>%
filter(complete.cases(.)) %>%
summarize(ratio = mean(rep_leaf_area / (rep_leaf_length * rep_leaf_width))) %>%
unlist()
ratio
#> ratio
#> 0.781981
我们可以这样使用比率:
df_all %>%
mutate(rep_leaf_area = ifelse(Year == 2020,
rep_leaf_length * rep_leaf_width * ratio,
rep_leaf_area))
#> Year rep_leaf_length rep_leaf_width rep_leaf_area
#> 1 2019 37.400 NA NA
#> 2 2019 21.036 8.080 132.91400
#> 3 2019 29.147 2.331 NA
#> 4 2020 16.600 4.000 51.92354
#> 5 2020 21.600 2.200 37.15974
请注意,这不会影响 2019 年的面积测量。
数据
df_all <- structure(list(Year = c(2019L, 2019L, 2019L, 2020L, 2020L),
rep_leaf_length = c(37.4, 21.036, 29.147, 16.6, 21.6),
rep_leaf_width = c(NA, 8.08, 2.331, 4, 2.2),
rep_leaf_area = c(NA, 132.914, NA, NA, NA)),
class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:0)
使用索引。计算索引行的面积并分配它们。
index <- dat$Year %in% 2020
areas <- apply(dat[index, 2:3], 1, prod)
dat[index, 4] <- areas
# Year rep_leaf_length rep_leaf_width rep_leaf_area
# 1 2019 37.400 NA NA
# 2 2019 21.036 8.080 132.914
# 3 2019 29.147 2.331 NA
# 4 2020 16.600 4.000 66.400
# 5 2020 21.600 2.200 47.520
数据:
dat <- structure(list(Year = c(2019L, 2019L, 2019L, 2020L, 2020L), rep_leaf_length = c(37.4,
21.036, 29.147, 16.6, 21.6), rep_leaf_width = c(NA, 8.08, 2.331,
4, 2.2), rep_leaf_area = c(NA, 132.914, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-5L))