/ / R, създайте / запълнете колона от кадър за данни въз основа на приблизително цифрово съвпадение с стойностите във втори кадър с данни - r, съвпадение

В R, създайте / запълнете колона от кадър с данни въз основа на приблизително цифрово съвпадение с стойности във втори кадър с данни - r, съвпадение

Имам две рамки за данни. Първият кадър с данни съдържа списък с наркотици с времето, когато ги видях в експеримента. Вторият информационен кадър съдържа списък със стандартите, които изпълнявах с моя експеримент - затова е друг списък с наркотици с очакваното време да ги видите.

Това, което се опитвам да направя, е да напиша името на правилния стандарт, за да бъде присвоен на правилното лекарство в първата рамка за данни.

Например, лекарството А се наблюдава при 5,5 минути. Стандартът на лекарството А се вижда на 5,7 минути.

Наблюдавано е лекарство В за 6 минути. Той използва същия стандарт като лекарството А, на 5.7 минути.

Лекарството С се наблюдава при 6,5 минути. Той използва стандарт, който се вижда на 7 минути.

Пример за оригинални рамки данни:

DF1:
Drug   Time
A     5.5
B     6.0
C     6.5

DF2:
Standard   Time
S1        5.7
S2        7

Ключът е, че искам R да търси стандарта с най-близо (в положителна или отрицателна посока) към един от стандартите в DF2 и след това да определи името на този стандарт (S1, S2) на DF1.

Пример за крайна рамка за данни:

Drug   Time   Standard
A      5.5     S1
B      6.0     S1
C      6.5     S2

Знам как мога да получа идеалните съвпадащи стойности, които да бъдат присвоени - но не съм сигурен как да накарам R да търси най-близката стойност в DF2 до стойността на времето за всеки ред в DF1.

Отговори:

1 за отговор № 1

Използвайки преливане и ръб, не толкова чист подход. Сигурен съм, че ще видим някои dplyr магия :)

DF1 = read.table(text="Drug   Time
A     5.5
B     6.0
C     6.5",header=TRUE,stringsAsFactors=FALSE)


DF2 = read.table(text="Standard   Time
S1        5.7
S2        7",header=TRUE,stringsAsFactors=FALSE)

За всяко наблюдение "Време" намираме минимално абсолютно "Стандартно" наблюдение и създаваме рамка за данни, съдържаща (време, стандартен) набор.

В крайна сметка комбинираме всички набори от рамки за данни чрез rbind.

DF2$Standard[which.min(abs(DF2$Time - x) )] това намира "Стандарт" с горното условие

DF3 = do.call(rbind,lapply(DF1$Time,function(x) {
data.frame(Time=x,Standard=DF2$Standard[which.min(abs(DF2$Time - x) )],stringsAsFactors=FALSE)
}))

final_DF = merge(DF1,DF3,by="Time")[,union(names(DF1), names(DF3))
final_DF
#  Drug Time Standard
#1    A  5.5       S1
#2    B  6.0       S1
#3    C  6.5       S2