使用dplyr高效地将数据分入指定的存储箱

使用dplyr高效地将数据分入指定的存储箱,r,dplyr,R,Dplyr,我有两个数据帧-一个数据帧有7个存储单元,指定每个存储单元的限制和名称(称为FJX_存储单元)和一个波长sigma对帧(测试_光谱)。我想根据FJX\u bin数据中的bin限制,在Test\u spectrum中创建一个名为bin\u number的新变量。这两种方法的dput如下所示 使用mutate和case_(当时)来强制执行此操作相对容易,但这里的关键是我希望解决方案能够扩展到任意数量的箱子。我的感觉是,dplyr中可能会有某种apply方法在这里有用,但我所能想到的就是使用for循环

我有两个数据帧-一个数据帧有7个存储单元,指定每个存储单元的限制和名称(称为FJX_存储单元)和一个波长sigma对帧(测试_光谱)。我想根据
FJX\u bin
数据中的bin限制,在Test\u spectrum中创建一个名为bin\u number的新变量。这两种方法的
dput
如下所示

使用
mutate
case_(当
时)来强制执行此操作相对容易,但这里的关键是我希望解决方案能够扩展到任意数量的箱子。我的感觉是,
dplyr
中可能会有某种
apply
方法在这里有用,但我所能想到的就是使用for循环,如下所示:

df <- test_spectra %>%
  mutate(bin_number = case_when(
    for(ii in 1:nrow(FJX_bins)){
      Wavelength >= FJX_bins$Lambda_Start[ii] & Wavelength < FJX_bins$Lambda_End[ii] ~
        FJX_bins$Bin_Number[ii]}
    ))

如果找不到
dplyr
解决方案:

library(data.table)
setDT(test_spectra)
setDT(FJX_bins)
test_spectra[FJX_bins, 
             bin_number := i.Bin_Number, 
             on = .(Wavelength >= Lambda_Start, Wavelength < Lambda_End)]
库(data.table)
setDT(测试光谱)
setDT(FJX_箱)
测试光谱[FJX\u箱,
bin_编号:=i.bin_编号,
on=(波长>=Lambda\u开始,波长

这将与bins表进行非等联接,并相应地设置bin编号。

fuzzyjoin
实现
dplyr
范围/间隔联接:

library(fuzzyjoin)

interval_left_join(
    FJX_bins, 
    test_spectra,
    by = c('Wavelength' = 'Lambda_Start', 'Wavelength' = 'Lambda_End')
)
#一个tible:52 x 5
波长西格玛二进制数λλλλ起点λ终点
12893.98e-20 1289298。
22903.89e-20 1289298。
32913.77e-20289298。
42923.64e-20289298。
52933.54e-20289298。
62943.39e-20289298。
7295 3.25e-20 1289 298。
82963.09e-20289298。
92972.93e-201289298。
102982.80e-201289298。
#…还有42行
使用dplyr:

将料位编号创建为一个系数

library(dplyr)
Test_Spectra <- mutate(test_spectra, 
                       bin = cut(Wavelength, breaks = c(FJX_bins$Lambda_Start, 850), 
                                 labels = FJX_bins$Bin_Number, right = F))
库(dplyr)

Test_光谱看起来与这类东西非常相似——这非常有效,正是我希望找到的。非常感谢。
# A tibble: 52 x 5
   Wavelength    Sigma Bin_Number Lambda_Start Lambda_End
        <int>    <dbl>      <int>        <dbl>      <dbl>
 1        289 3.98e-20          1          289       298.
 2        290 3.89e-20          1          289       298.
 3        291 3.77e-20          1          289       298.
 4        292 3.64e-20          1          289       298.
 5        293 3.54e-20          1          289       298.
 6        294 3.39e-20          1          289       298.
 7        295 3.25e-20          1          289       298.
 8        296 3.09e-20          1          289       298.
 9        297 2.93e-20          1          289       298.
10        298 2.80e-20          1          289       298.
# … with 42 more rows
library(dplyr)
Test_Spectra <- mutate(test_spectra, 
                       bin = cut(Wavelength, breaks = c(FJX_bins$Lambda_Start, 850), 
                                 labels = FJX_bins$Bin_Number, right = F))
Test_Spectra <- mutate(test_spectra, 
                       bin = as.character(cut(Wavelength, 
                                          breaks = c(FJX_bins$Lambda_Start, 850), 
                                          labels = FJX_bins$Bin_Number, right = F)))