如何使用R中的if语句将唯一函数应用于数据集的多行?
在这个数据集(df)中,我想应用一个基于物种的不同方程来计算存储在“Std.Val1”中的新输出 但我一直遇到这样一个错误:“错误:如何使用R中的if语句将唯一函数应用于数据集的多行?,r,loops,if-statement,R,Loops,If Statement,在这个数据集(df)中,我想应用一个基于物种的不同方程来计算存储在“Std.Val1”中的新输出 但我一直遇到这样一个错误:“错误:mutate()inputStd.Val1有问题。 无法将x“语言”对象强制为“逻辑”类型 ℹ 输入nem1是ifelse(…)“当而不是ifelse时,您使用的语法是用于case\ucase\u当用于避免编写这样多个嵌套的ifelse语句时 library(dplyr) df %>% mutate(Std.Val1 = case_when(specie
mutate()
inputStd.Val1
有问题。
无法将x“语言”对象强制为“逻辑”类型
ℹ 输入
nem1
是ifelse(…)
“当而不是ifelse
时,您使用的语法是用于case\ucase\u当
用于避免编写这样多个嵌套的ifelse
语句时
library(dplyr)
df %>%
mutate(Std.Val1 = case_when(species == "A" ~ ((log(Val1) - c_A )/(m_A)),
species == "B" ~ ((log(Val1) - c_B )/(m_B)),
species == "C" ~ ((log(Val1) - c_C )/(m_C)),
species == "D" ~ ((log(Val1) - c_D )/(m_D))))
如果所有条件都不匹配,默认情况下它将返回NA
。以下是一种data.table方法,它避免了大量的键入
library(data.table)
# Sample data
DT <- fread("Year Site Quadrant species Val1 Val2
2019 1 1 A 20 30
2019 1 1 B NA 25
2019 1 2 C 20 10
2019 1 2 D 11 22 ")
# Create lookup table with values to calculate with
DT.lookup <- data.table( species = LETTERS[1:4],
vc = c(1,2,10,11),
vm = c(2,3,12,2))
# species vc vm
# 1: A 1 2
# 2: B 2 3
# 3: C 10 12
# 4: D 11 2
# Join and calculate in 1 step
DT[DT.lookup, Std.Val1 := (log(Val1) - i.vc )/(i.vm), on = .(species)][]
# Year Site Quadrant species Val1 Val2 Std.Val1
# 1: 2019 1 1 A 20 30 0.9978661
# 2: 2019 1 1 B NA 25 NA
# 3: 2019 1 2 C 20 10 -0.5836890
# 4: 2019 1 2 D 11 22 -4.3010524
库(data.table)
#样本数据
DT将参数存储为向量也将使其更加简单:
c_value <- c(A = 1, B = 2, C = 10, D = 11)
m_value <- c(A = 2, B = 5, C = 12, D = 2)
dtt %>%
mutate(Std.Val1 = (log(Val1) - c_value[species])/m_value[species])
# Year Site Quadrant species Val1 Val2 Std.Val1
# 1: 2019 1 1 A 20 30 0.9978661
# 2: 2019 1 1 B NA 25 NA
# 3: 2019 1 2 C 20 10 -0.5836890
# 4: 2019 1 2 D 11 22 -4.3010524
c_值
library(data.table)
# Sample data
DT <- fread("Year Site Quadrant species Val1 Val2
2019 1 1 A 20 30
2019 1 1 B NA 25
2019 1 2 C 20 10
2019 1 2 D 11 22 ")
# Create lookup table with values to calculate with
DT.lookup <- data.table( species = LETTERS[1:4],
vc = c(1,2,10,11),
vm = c(2,3,12,2))
# species vc vm
# 1: A 1 2
# 2: B 2 3
# 3: C 10 12
# 4: D 11 2
# Join and calculate in 1 step
DT[DT.lookup, Std.Val1 := (log(Val1) - i.vc )/(i.vm), on = .(species)][]
# Year Site Quadrant species Val1 Val2 Std.Val1
# 1: 2019 1 1 A 20 30 0.9978661
# 2: 2019 1 1 B NA 25 NA
# 3: 2019 1 2 C 20 10 -0.5836890
# 4: 2019 1 2 D 11 22 -4.3010524
c_value <- c(A = 1, B = 2, C = 10, D = 11)
m_value <- c(A = 2, B = 5, C = 12, D = 2)
dtt %>%
mutate(Std.Val1 = (log(Val1) - c_value[species])/m_value[species])
# Year Site Quadrant species Val1 Val2 Std.Val1
# 1: 2019 1 1 A 20 30 0.9978661
# 2: 2019 1 1 B NA 25 NA
# 3: 2019 1 2 C 20 10 -0.5836890
# 4: 2019 1 2 D 11 22 -4.3010524