Как отсортировать и извлечь значения с несколькими условиями в R? - PullRequest
0 голосов
/ 20 января 2019

У меня есть проблема условного извлечения данных. Я уже написал код на Python. Я учу R; и я хотел бы повторить тот же код в R.

Я пытался поставить условные аргументы, используя которые, но это, похоже, не работает. Я еще не полностью разбираюсь в синтаксисе R.

У меня есть датафрейм с 2 столбцами: x и y Идея состоит в том, чтобы извлечь список максимальных 5 x-значений, умноженных на 2, соответствующих максимальным y-значениям, с условием, что мы выберем только те значения y, которые как минимум в 0,45 раза превышают пиковое значение y.

Итак, алгоритм будет иметь следующие шаги:

  1. Находим пиковое значение y: max_y

  2. Определяем порог = 0,45 * max_y

  3. Мы применяем фильтр, чтобы получить список всех значений y, которые превышают пороговое значение: y_filt

  4. Мы получаем список значений x, соответствующих значениям y на шаге 3: x_filt

  5. Если число значений в x_filt меньше или равно 5, то нашим результатом будут значения в x_filt, умноженные на 2

  6. Если x_filt имеет более 5 значений, мы выбираем только 5 значений, соответствующих 5 максимальным значениям y в списке. Затем мы умножаем на 2, чтобы получить наш результат

Код Python

max_y = max(y)
max_x = x[y.argmax()]
print (max_x, max_y)

threshold = 0.45 * max_y
y_filt = y [y > threshold]
x_filt = x [y > threshold]


if len(y_filt) > 4:
    n_highest = 5
else:
    n_highest = len(y_filt)

y_filt_highest = y_filt.argsort()[-n_highest:][::-1]        
result = [x_filt[i]*2 for i in range(len(x_filt)) if i in y_filt_highest]

Например, набор данных

x           y
1          20
2           7
3           5
4          11
5           0  
6           8
7           3
8          10
9           2
10          6
11         15
12         18
13          0
14          1
15         12

Приведенный выше код даст следующие результаты

max_y = 20
max_x = 1
threshold = 9
y_filt = [20, 11, 10, 15, 18, 12]
x_filt = [1, 4, 8, 11, 12, 15]
n_highest = 5
y_filt_highest = [20, 11, 15, 18, 12]
result = [2, 8, 22, 24, 30]

Я хочу сделать то же самое в R.

1 Ответ

0 голосов
/ 20 января 2019

Одной из причин того, что R настолько мощен / прост в использовании для статистической работы, является то, что встроенный data.frame является основополагающим.Использование одного здесь упрощает вещи:

# Create a dataframe with the toy data
df <- data.frame(x = 1:10, y = c(20, 7, 5, 11, 0, 8, 3, 10, 2, 6))

# Refer to columns with the $ notation
max_y <- max(df$y)
max_x <- df$x[which(df$y == max_y)]

# If you want to print both values, you need to create a list with c()
print(c(max_x, max_y))
# But you could also just call the values directly, as in python
max_x
max_y

# Calculate a threshold and then create a filtered data.frame
threshold <- 0.45 * max_y
df_filt <- df[which(df$y > threshold), ]
df_filt <- df_filt[order(-df_filt$y), ]
if(nrow(df_filt) > 5){
  df_filt <- df_filt[1:5, ]
}

# Calculate the result
result <- df_filt$x * 2
# Alternatively, you may want the result to be part of your data.frame
df_filt$result <- df_filt$x*2

# Should show identical results
max_y
max_x
threshold
df_filt # Probably don't want to print a df if it is large
result

Конечно, если вам действительно нужны отдельные векторы для y_filt и x_filt, вы можете легко создать их после факта:

y_filt <- df_filt$y
x_filt <- df_filt$x

Обратите внимание, что, подобно numpy.argmax, which(df$y == max(y)) будет возвращать несколько значений, если ваш максимум не уникален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...