我有一个数据框架,其中有两列包含植物叶片长度和宽度数据。
对于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
非常感谢Jan
I认为您的意思是,您希望使用当年的(测量的(叶长和叶宽来推断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))
使用索引。计算索引行的面积并分配它们。
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))