如何在R中的X,Y值的数据集中给定X的范围来找出Y的最小值?

时间:2016-10-19 07:15:01

标签: r graph

假设下面的数据集:

X   Y 
2   10
4   8
6   12
8   5
10  16
12  10
14  14
16  12
18  8
20  5
22  14
24  18
26  2
28  4
30  6

使用which.max(maydata$Y)which.min(maydata$Y)很容易找出Y的最大值或最小值。

我想在给出特定范围的X时找出Y的值。像(我知道这不是正确的语法):

which.min(profile_data1[profile_data1$X1>8 & profile_data1$X1 >20 ][2])

4 个答案:

答案 0 :(得分:3)

您可以使用以下命令查找给定Y的{​​{1}}的最大值:

X > 8 & X < 20

此处,max(subset(dat, X > 8 & X < 20, select = "Y")) # [1] 16 是数据框的名称。

答案 1 :(得分:3)

罗小涛严厉地指出了一个错误,这将输出正确的值。

df[df$X > 8 & df$X < 20,"Y"][which.max(df[df$X > 8 & df$X < 20,"Y"])]

解释因为它变得漫长而令人困惑:
df[df$X > 8 & df$X < 20,"Y"]:选择所有Y> 20> X&gt; 8
which.max(df[df$X > 8 & df$X < 20,"Y"]):此处的最大Y,= 1 的索引  df[df$X > 8 & df$X < 20,"Y"]:与之前相同的子集,它是向量
 在这种情况下,df[df$X > 8 & df$X < 20,"Y"][which.max(df[df$X > 8 & df$X < 20,"Y"])]相当于:df[df$X > 8 & df$X < 20,"Y"][1],所以我们只选择向量的第一个值。

Sven Hohenstein的解决方案更高效,更容易实现,但希望这有助于您了解R索引的工作原理。

答案 2 :(得分:2)

尝试(获取最大Y的行索引8 < X < 20):

> as.numeric(row.names(df[df$X > 8 & df$X < 20, ])[match(max(df[df$X > 8 & df$X < 20, "Y"]), df[df$X > 8 & df$X < 20, "Y"])])
  

结果(原始数据框中的行索引):

[1] 5

如果您想要值:

> df[as.numeric(row.names(df[df$X > 8 & df$X < 20, ])[match(max(df[df$X > 8 & df$X < 20, "Y"]), df[df$X > 8 & df$X < 20, "Y"])]), "Y"]
  

结果(值):

[1] 16

修改

更容易理解:

> Sub.df <- df[df$X > 8 & df$X < 20, ]
> Sub.df
   X  Y
5 10 16
6 12 10
7 14 14
8 16 12
9 18  8
> result.index <- as.numeric(row.names(Sub.df)[match(max(Sub.df$Y), Sub.df$Y)])
> result.index
[1] 5
> result.value <- df[result.index, "Y"]
> result.value
[1] 16

答案 3 :(得分:2)

或者这个:

max(df[with(df, X>=10 & X<=22),]$Y)
#[1] 16

或使用%in%

max(subset(df, X %in% 10:22)$Y)

或使用match

max(df[with(df, !is.na(match(X, 10:22))),]$Y)