繁体   English   中英

R:使用每个类别的不同方程按类别计算新变量

[英]R: Caculating new variable by category with a different equation for each category

我一直在寻找这个问题的答案一段时间,但似乎没有什么适合我。

我有一个名为“数据”的 dataframe,如下所示:

物种 长度 重量
一个 15 0
一个 8 0
20 0
C 4 0
11 0
16 0
C 13 0

我想做的是根据物种的长度计算每个物种的重量 ant 用结果填充重量列。 为此,我已经为每个物种获得了一个方程,因为每个物种都有不同的长度-重量关系。 假设这些长度-重量方程如下所示:

  • “A”种:重量=长度*2
  • “B”种:重量=长度^3
  • “C”种:重量=长度/5

因此,因此,我想要一个看起来像这样的 dataframe:

物种 长度 重量
一个 15 30
一个 8 16
20 8000
C 4 0.8
11 1331
16 4096
C 13 3.6

我试图这样做:

Species <- c("A", "A", "B", "C", "B","B","C")
Length <- c(15,8,20,4,11,16,13)
Weight <- c(0,0,0,0,0,0,0)
data <- data.frame(Species, Length, Weight)

for(i in 1:length(data$Length)){if(data$Species[i]=="A"){
data$Weight[i]<-data$Length[i]*2
}else if(data$Species[i]=="B"){
data$Weight[i]<-data$Length[i]^3
}else if(data$Species=="C"){
data$Weight[i]<-data$Length[i]/5
} else {data$Weight[i]<-"NA"}
}

代码运行没有错误,但 data$Weigth 列未填充结果。 但是,当我尝试代码而不使用 for() 并将 [i] 替换为行号(例如 [4])时,它做了正确的事情并用该行的结果填充了 Weight 列。

实际上,我有 40 个物种和超过 5000 个观察值,因此不能单独运行每一行的代码。

有什么建议么? 也许有更简单的方法,但我没有看到? 任何帮助都感激不尽。

谢谢

在基础 R 中,您可以执行以下操作:

transform(df, 
  Weight = Vectorize(\(x, type) switch(type, A = x*2, B= x^3, C =x/5))(Length, Species))

  Species Length Weight
1       A     15   30.0
2       A      8   16.0
3       B     20 8000.0
4       C      4    0.8
5       B     11 1331.0
6       B     16 4096.0
7       C     13    2.6

library(tidyverse)
df %>%
  mutate(Weight = case_when(Species == 'A' ~Length * 2,
                            Species == 'B' ~ Length ^ 3,
                            Species == 'C' ~ Length / 5))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM