R:根据观察结果得出的条件

时间:2019-01-25 16:17:51

标签: r dataframe conditional-statements

我有一个R data.frame,具有快速的傅立叶变换结果。列是功率和频率。出于研究目的,我选择了全部FFT结果的一部分(频率在1到48之间)。

我必须在频率范围内标识maximum 5 peaks (highest powers)。此外,在某些情况下,我们不会考虑任何低于最高峰45%的峰。我将分享以下代码:

df_FFT_2 <- select(filter(df_FFT, frequency <49 & frequency >0 ),c(frequency, power))
with(df_FFT_2,plot(frequency,power, type = "l"))



max_power <- max(df_FFT_2$power)
max_freq <- df_FFT_2$frequency[which(df_FFT_2$power == max_power)]
print(c(max_power, max_freq))


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


freq_FFT <- df_filt$frequency 
n = length(freq_FFT)

此代码可以正常工作。使用不同的输入数据集,我得到1个(最小),2、3、4或5个(最大)峰值。

但是,这只是我正在使用的完整原型的一小部分。我发现当我只达到一个峰时,最终结果不是很好。即使第二个峰值at least 2 peaks,是阈值条件,我也想选择does not satisfy

我想提出一个条件

if (length(freq_FFT) < 2){
   disregard the threshold condition and find the two highest peaks.
}

我无法相应地修改代码。

1 个答案:

答案 0 :(得分:0)

请考虑预先对主要数据进行排序,然后添加一个条件块,该条件块将使用主数据集中的前两个(使用rbind)过滤的数据进行堆叠。并且由于单行可能是领先的 power ,因此请运行unique对数据进行重复数据删除。下面的代码注释表示进行了调整:

...
threshold <- 0.45 * max_power
df_FFT_2 <- df_FFT_2[order(-df_FFT_2$power), ]                  # ORDER BY DESCENDING POWER
df_filt <- df_FFT_2[which(df_FFT_2$power > threshold), ]
df_filt <- df_filt[order(-df_filt$power), ]

if(nrow(df_filt) > 5) {
  df_filt <- head(df_filt, 5)                                   # CHANGED TO head()
}

# NEW IF LOGIC BLOCK
if(nrow(df_filt) < 2) {
  df_filt <- rbind(df_filt,
                   head(df_FFT_2, 2))                           # TOP TWO  ROWS
  df_filt <- unique(df_filt)
}