如何根据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年的最大值
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")