2016-10-19 39 views
-1

假设下面的数据集:如何找出Y的最小值给定X的数据集中的X范围,R中的Y值?

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 

它很容易找出哪些是最大或Y的最小值,使用which.max(maydata$Y)which.min(maydata$Y)

我想知道给定X的特定范围时Y的值。喜欢的事(我知道这是不正确的语法):

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

'which.max(DF [DF $ X> 5&DF $ X <例如14,“Y”])''。它返回索引,所以如果你想要的值,你必须嵌套到'df $ Y []' – Haboryme

+0

@Haboryme感谢您的快速回复。这是返回行号,而不是Y的值。:( –

+0

@Haboryme我的猜测我可以使用它... ...'mydata [which.max(mydata [mydata $ X> 5&mydata $ X <14,“Y”]] ),[2]' –

回答

3

您可以使用下面的命令鳍d的Y最大值给出X > 8 & X < 20

max(subset(dat, X > 8 & X < 20, select = "Y")) 
# [1] 16 

这里,dat是你的数据帧的名称。

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 
+0

Xiaotao Luo非常感谢你的回答,但在我看来,解决方案by @Haboryme更容易理解和实施。 –

+0

'df $ Y [which.max(df [df $ X> 5&df $ X <14,“Y”])]' –

+0

我错了,我以为你想要在该值的原始数据框中的行索引。 –

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> 8
which.max(df[df$X > 8 & df$X < 20,"Y"]):最大Y的索引,= 这里
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索引如何工作。

+0

伟大的比较。 @Haboryme –

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) 
相关问题