Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R中的if语句将唯一函数应用于数据集的多行?_R_Loops_If Statement - Fatal编程技术网

如何使用R中的if语句将唯一函数应用于数据集的多行?

如何使用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

在这个数据集(df)中,我想应用一个基于物种的不同方程来计算存储在“Std.Val1”中的新输出

但我一直遇到这样一个错误:“错误:
mutate()
input
Std.Val1
有问题。 无法将x“语言”对象强制为“逻辑”类型
ℹ 输入
nem1
ifelse(…)

而不是
ifelse
时,您使用的语法是用于
case\u
case\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