Нарисуйте ближайшее значение из отсортированного фрейма данных в несортированный фрейм данных
У меня есть два кадра данных в R
, Первый кадр данных представляет собой совокупное распределение частот (cumFreqDist
с соответствующими периодами. Первые строки фрейма данных выглядят так:
Time cumfreq
0 0.0000000
4 0.9009009
6 1.8018018
8 7.5075075
12 23.4234234
16 39.6396396
18 53.4534535
20 58.2582583
24 75.3753754
100 100.0000000
Второй кадр данных составляет 10000 отрисовок из runif
распространение, используя код:
testData <- (runif(10000))*100
Для каждого ряда в testData
Я хочу найти соответствующий cumfreq
в cumFreqDist
и добавить соответствующий Time
значение в новый столбец в testData
, Так как testData
тестовый фрейм данных для реального фрейма данных, я не хочу сортировать testData
,
Потому что я имею дело с кумулятивными частотами, если testData
значение 23.30...
Time
значение, которое должно быть возвращено 8
, То есть мне нужно найти ближайший cumfreq
значение, которое не превышает testData
значение и вернуть только это одно значение.
data.table
пакет был упомянут для других подобных вопросов, но мое ограниченное понимание состоит в том, что этот пакет требует, чтобы ключ идентифицировался в обоих фреймах данных (после преобразования в таблицы данных), и я не могу предположить, что testData
Значения соответствуют требованиям для назначения в качестве ключа - и кажется, что назначение ключа будет сортировать данные. Это вызовет у меня проблемы, когда я начну сеять позже в дальнейшей работе, которую я делаю.
1 ответ
findInterval()
идеально подходит для этого:
set.seed(1);
cumFreqDist <- data.frame(Time=c(0,4,6,8,12,16,18,20,24,100), cumfreq=c(0.0000000,0.9009009,1.8018018,7.5075075,23.4234234,39.6396396,53.4534535,58.2582583,75.3753754,100.0000000) );
testData <- data.frame(x=runif(10000)*100);
testData$Time <- cumFreqDist$Time[findInterval(testData$x,cumFreqDist$cumfreq)];
head(testData,20);
## x Time
## 1 26.550866 12
## 2 37.212390 12
## 3 57.285336 18
## 4 90.820779 24
## 5 20.168193 8
## 6 89.838968 24
## 7 94.467527 24
## 8 66.079779 20
## 9 62.911404 20
## 10 6.178627 6
## 11 20.597457 8
## 12 17.655675 8
## 13 68.702285 20
## 14 38.410372 12
## 15 76.984142 24
## 16 49.769924 16
## 17 71.761851 20
## 18 99.190609 24
## 19 38.003518 12
## 20 77.744522 24