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