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

  • 本文关键字:添加 三列 两列 数据 r dplyr
  • 更新时间 :
  • 英文 :


我有一个数据框架,其中有两列包含植物叶片长度和宽度数据。

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

相关内容

最新更新