将两列中的数据相乘并将其添加到现有的第三列

时间:2020-12-21 10:32:15

标签: r mutate

我有一个包含植物叶长和宽度数据的两列数据框。

对于 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

非常感谢简

2 个答案:

答案 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))
相关问题