我在一列中有值,并希望从该列中的非零范围中选择最大值。范围由两个零之间的非零值定义。我不确定这种解释是否正确。请参见下面的示例。我已经做到了这是excel,但是我需要能够在R中做到这一点,而且我不确定如何去做。任何从何处开始的指南将不胜感激。我的目标是名为“ out”的列。
ind <-c(0,0,0,0.4,0.6,0.7,0.7,0.9,0,0,0,1,3,10,0,0)
out <-c(0,0,0,0.9,0.9,0.9,0.9,0.9,0,0,0,10,10,10,10,0,0)
bbb <-data.frame(ind,out)
答案 0 :(得分:1)
总是最好提供一个可以由其他用户轻松再现的问题示例,因此屏幕截图并非最佳选择。以下是您将来创建的方法:
library(data.table)
set.seed(1)
dt = data.table(x = sample(0:5, replace = TRUE, prob = c(0.5, rep(0.1,5)), size = 25))
现在针对您的实际问题,您首先需要创建一个ID,该ID标识以零分隔的非零条纹:
dt[, id := rleid(x == 0)]
接下来,您可以计算每个id组的最大值并将其放在新列中:
dt[, max_val := max(x), by = id]
结果如下:
x id max_val
1: 0 1 0
2: 0 1 0
3: 2 2 2
4: 1 2 2
5: 0 3 0
6: 5 4 5
7: 1 4 5
8: 3 4 5
9: 3 4 5
10: 0 5 0
11: 0 5 0
12: 0 5 0
13: 3 6 3
14: 0 7 0
15: 4 8 4
16: 0 9 0
17: 4 10 4
18: 1 10 4
19: 0 11 0
20: 4 12 4
21: 1 12 4
22: 0 13 0
23: 3 14 3
24: 0 15 0
25: 0 15 0
x id max_val
从技术上讲,您可以同时使用
完成这两个步骤dt[, max_val2 := max(x), by = rleid(x == 0)]
但我希望将其显示在单独的步骤中。
答案 1 :(得分:0)
您可以使用以下代码:
max(matrix[,1])
只需将'matrix'替换为对象名称,并将1替换为您要测试的列号
答案 2 :(得分:0)
这是一种迭代方式。对于大型数据集来说可能很慢。
m=c(0,0,0,0.1,0.6,0.3,0,0,0.2,0.1,0.2,0,0,0)
maxims=0
aux=NULL
pos=1
for (i in 1:length(m)){
if (m[i]!=0){
aux=c(aux,m[i])
}
if (m[i]==0 && length(aux)>0){
maxims[pos]=max(aux)
aux=NULL
pos=pos+1
}
}
> maxims
[1] 0.6 0.2
答案 3 :(得分:0)
使用dplyr的方法:
library(dplyr)
# example of data:
df <- data.frame(x=c(0,0,0,0, 1, 2, 4, 4,0,0,0,0, 2, 34, 23, -1, 0,0,0,0, 43, 23, -11, 4,0, 0, 0))
# create a var "series" that split data by group when finding "first" 0
df <- df %>% mutate(series = cumsum((x != 0 ) & (lag(x) == 0 )))
# group all 0 values
df$series <- ifelse(df$x == 0, 0, df$series)
# create the var wanted
df<- df %>% group_by(series) %>% mutate(max = max(x))