如何在R中使用多个条件对值进行排序和提取?

时间:2019-01-20 17:32:37

标签: python r dataframe

我有一个基本的条件数据提取问题。我已经用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. 我们在步骤3中获得了与y值相对应的x值列表:x_filt

  5. 如果x_filt中的值数量小于或等于5,那么我们的结果将是x_filt中的值乘以2

  6. 如果x_filt具有超过5个值,则我们仅选择与列表中5个最大y值相对应的5个值。然后我们乘以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 :(得分:0)

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_filtx_filt使用单独的向量,则可以在事实发生后轻松创建它们:

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

请注意,如果最大值不是唯一的,则numpy.argmaxwhich(df$y == max(y))一样会返回多个值。