我有一个基本的条件数据提取问题。我已经用Python编写了代码。我正在学习R;我想在R中复制相同的代码。
我试图使用条件参数,但是似乎不起作用。我尚未完全熟悉R语法。
我有一个包含2列的数据框:x和y 这个想法是提取一个最多5个x值乘以2对应于最大y值的列表,条件是我们将只选择那些至少是最大y值0.45倍的y值。
因此,该算法将执行以下步骤:
我们找到y的峰值:max_y
我们定义阈值= 0.45 * max_y
我们应用过滤器来获取所有大于阈值的y值的列表:y_filt
我们在步骤3中获得了与y值相对应的x值列表:x_filt
如果x_filt中的值数量小于或等于5,那么我们的结果将是x_filt中的值乘以2
如果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中也这样做。
答案 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_filt
和x_filt
使用单独的向量,则可以在事实发生后轻松创建它们:
y_filt <- df_filt$y
x_filt <- df_filt$x
请注意,如果最大值不是唯一的,则numpy.argmax
和which(df$y == max(y))
一样会返回多个值。