2016-10-19 2 views
-1

Предположим ниже набора данных:Как определить минимальные значения Y, заданные диапазоном X в наборе данных значений X, Y в R?

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).

Я хочу узнать значения Y, когда задан конкретный диапазон X. Нечто подобное (я знаю, что это не правильный синтаксис):

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

'which.max (ДФ [DF $ X> 5 и DF $ X < 14, «Y»)). Он возвращает индекс, поэтому, если вы хотите получить значение, вам нужно вложить его в 'df $ Y []' – Haboryme

+0

@Haboryme Спасибо за быстрый ответ. это возвращает номер строки, а не значение Y. :( –

+0

@Haboryme моя догадка я могу использовать его ... 'mydata [who.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

Try (получить индекс строки макс 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 

EDIT:

Чтобы легче понять:

> 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 [who.max (df [df $ X> 5 & df $ X <14," Y "])]' –

+0

Моя ошибка, я думал, что вам нужен индекс строки в исходном фрейме данных этого значения. –

3

Xiaotao Luo решительно указал на ошибку, это приведет к правильному значению.

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) 
Смежные вопросы