2016-10-19 78 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) 
相關問題