如何根据R dataframe中特定列的条件获取行最大值?

如何根据R dataframe中特定列的条件获取行最大值?,r,if-statement,max,mutate,rowwise,R,If Statement,Max,Mutate,Rowwise,我试图通过几列(气候缺水--def;u z#)逐行获得最大值,这取决于经过的时间(火灾后的时间--年.DIFF)。以下是条件: 如果1年过去了,请选择第一年的赤字值。 (def_59_z_1) 如果为2年:前2年的最大赤字 如果为3年:前3年的最大赤字 如果为4年:前4年的最大赤字 如果5年或以上:前5年的最大值 但是,当我包含条件时,我无法提取行最大值。有几个现有的帖子涉及行方式的min和max(示例和)以及sd(示例)——但它们不使用条件。我尝试过使用apply,但当我涉及多个列以及一个

我试图通过几列(气候缺水--
def;u z#
)逐行获得最大值,这取决于经过的时间(火灾后的时间--
年.DIFF
)。以下是条件:

  • 如果1年过去了,请选择第一年的赤字值。 (
    def_59_z_1
  • 如果为2年:前2年的最大赤字
  • 如果为3年:前3年的最大赤字
  • 如果为4年:前4年的最大赤字
  • 如果5年或以上:前5年的最大值
但是,当我包含条件时,我无法提取行最大值。有几个现有的帖子涉及行方式的min和max(示例和)以及sd(示例)——但它们不使用条件。我尝试过使用
apply
,但当我涉及多个列以及一个条件要求时,我无法找到解决方案

下面的代码在新列
def59_z_max15
中仅返回3.5,这是数据帧中出现的最大值,除非
YEAR.DIFF
为1,在这种情况下直接返回
def_50_z_1
。但对于所有其他条件,我需要0.98、0.67、0.7、1.55、1.28——反映指定列的行最大值的值。链接到示例数据。我怎样才能做到这一点

我感谢你的任何建议

data <- data %>%
mutate(def59_z_max15 = ifelse(YEAR.DIFF == 1,
                            (def59_z_1),
                            ifelse(YEAR.DIFF == 2,
                                   max(def59_z_1, def59_z_2),
                                   ifelse(YEAR.DIFF == 3,
                                          max(def59_z_1, def59_z_2, def59_z_3),
                                          ifelse(YEAR.DIFF == 4,
                                                 max(def59_z_1, def59_z_2, def59_z_3, def59_z_4),
                                                 max(def59_z_1, def59_z_2, def59_z_3, def59_z_4, def59_z_5))))))
数据%
变异(def59_z_max15=ifelse(YEAR.DIFF==1,
(def59_z_1),
ifelse(YEAR.DIFF==2,
最大值(def59_z_1,def59_z_2),
ifelse(年份差异==3,
最大值(def59_z_1、def59_z_2、def59_z_3),
ifelse(年份差异==4,
最大值(def59_z_1、def59_z_2、def59_z_3、def59_z_4),
max(def59_z_1、def59_z_2、def59_z_3、def59_z_4、def59_z_5‘‘‘’))

将此函数放入
应用
系列函数中

func <- function(x) {
first.val <- x[1]
if (first.val < 5) {
return(max(x[2:(first.val+)])
} else {
return(max(x[2:6]))
}
}

将此函数放入
apply
family函数中

func <- function(x) {
first.val <- x[1]
if (first.val < 5) {
return(max(x[2:(first.val+)])
} else {
return(max(x[2:6]))
}
}

一个选项是在循环中分别获得每组条件的
pmax
(行
max
-矢量化)(
map
-如果'YEAR.DIFF'的值为1,则仅选择'def_59_z_1',对于2,获取'def_59_z_1'和'def_59_z_2'的最大值,…,对于5,将'def_59_z_1'最大值选择为'def_59_z_5',
将列合并在一起,并用所有'def_59_z'列的
pmax替换其余的
NA

库(tidyverse)
超出%
选择(序列长度(.x)+1)%>%
转换(val=na_if((df1[[“YEAR.DIFF”]]=.x)*
pmax(!!!rlang::syms(名称(.)),0))%>%
transmute(def59_z_max15=合并(!!!rlang::syms(名称())))%%>%
绑定列(df1),%%>%
当(is.na(def59_z_max15)~
pmax(!!!rlang::syms(名称(.)[2:6]),TRUE~def59_z_max15))
头部(外侧,10)
#年份差异定义59_z_1定义59_z_2定义59_z_3定义59_z_4定义59_z_5定义59_z_最大15
#1          5      0.25     -2.11      0.98     -0.07      0.31          0.98
#2          9      0.67      0.65     -0.27      0.52      0.26          0.67
#3         10      0.56      0.33      0.03      0.70     -0.09          0.70
#4          2     -0.34      1.55     -1.11     -0.40      0.94          1.55
#5          4      0.98      0.71      0.41      1.28     -0.14          1.28
#6          3      0.71     -0.17      1.70     -0.57      0.43          1.70
#7          4     -1.39     -1.71     -0.89      0.78      1.22          0.78
#8          4     -1.14     -1.46     -0.72      0.74      1.32          0.74
#9          2      0.71      1.39      1.07      0.65      0.29          1.39
#10         1      0.28      0.82     -0.64      0.45      0.64          0.28
数据
df1一个选项是为循环中的每组条件分别获取
pmax
(行
max
-矢量化)(
map
-如果'YEAR.DIFF'的值为1,则仅选择'def_59_z_1',对于2,获取'def_59_z_1'和'def_59_z_2'的最大值,…,对于5,将'def_59_z_1'最大值选择为'def_59_z_5',
将列合并在一起,并用所有'def_59_z'列的
pmax替换其余的
NA

库(tidyverse)
超出%
选择(序列长度(.x)+1)%>%
转换(val=na_if((df1[[“YEAR.DIFF”]]=.x)*
pmax(!!!rlang::syms(名称(.)),0))%>%
transmute(def59_z_max15=合并(!!!rlang::syms(名称())))%%>%
绑定列(df1),%%>%
当(is.na(def59_z_max15)~
pmax(!!!rlang::syms(名称(.)[2:6]),TRUE~def59_z_max15))
头部(外侧,10)
#年份差异定义59_z_1定义59_z_2定义59_z_3定义59_z_4定义59_z_5定义59_z_最大15
#1          5      0.25     -2.11      0.98     -0.07      0.31          0.98
#2          9      0.67      0.65     -0.27      0.52      0.26          0.67
#3         10      0.56      0.33      0.03      0.70     -0.09          0.70
#4          2     -0.34      1.55     -1.11     -0.40      0.94          1.55
#5          4      0.98      0.71      0.41      1.28     -0.14          1.28
#6          3      0.71     -0.17      1.70     -0.57      0.43          1.70
#7          4     -1.39     -1.71     -0.89      0.78      1.22          0.78
#8          4     -1.14     -1.46     -0.72      0.74      1.32          0.74
#9          2      0.71      1.39      1.07      0.65      0.29          1.39
#10         1      0.28      0.82     -0.64      0.45      0.64          0.28
数据
df1@Dij它用于评估列以获得values@Dij它是用来计算列以获得值谢谢你,@Dij。但是我不明白为什么我不使用max(x[2:(1+)
library(tidyverse)
out <- map_dfc(1:5, ~
         df1 %>% 
           select(seq_len(.x) + 1) %>% 
           transmute(val = na_if((df1[["YEAR.DIFF"]] == .x)*
               pmax(!!! rlang::syms(names(.))), 0))) %>%  
  transmute(def59_z_max15 = coalesce(!!! rlang::syms(names(.)))) %>%
  bind_cols(df1, .)%>%
  mutate(def59_z_max15 = case_when(is.na(def59_z_max15) ~ 
         pmax(!!! rlang::syms(names(.)[2:6])), TRUE ~ def59_z_max15))
head(out, 10)
#   YEAR.DIFF def59_z_1 def59_z_2 def59_z_3 def59_z_4 def59_z_5 def59_z_max15
#1          5      0.25     -2.11      0.98     -0.07      0.31          0.98
#2          9      0.67      0.65     -0.27      0.52      0.26          0.67
#3         10      0.56      0.33      0.03      0.70     -0.09          0.70
#4          2     -0.34      1.55     -1.11     -0.40      0.94          1.55
#5          4      0.98      0.71      0.41      1.28     -0.14          1.28
#6          3      0.71     -0.17      1.70     -0.57      0.43          1.70
#7          4     -1.39     -1.71     -0.89      0.78      1.22          0.78
#8          4     -1.14     -1.46     -0.72      0.74      1.32          0.74
#9          2      0.71      1.39      1.07      0.65      0.29          1.39
#10         1      0.28      0.82     -0.64      0.45      0.64          0.28
df1 <- read.csv("https://raw.githubusercontent.com/CaitLittlef/random/master/data.csv")