/ / W R, utwórz / wypełnij kolumnę ramki danych w oparciu o przybliżone dopasowanie liczbowe do wartości w drugiej ramce danych - r, dopasowanie

W R utwórz / wypełnij kolumnę ramki danych na podstawie przybliżonego dopasowania liczbowego do wartości w drugiej ramce danych - r, dopasowując

Mam dwie ramki danych. Pierwsza ramka danych zawiera listę leków w momencie, gdy zobaczyłem je w eksperymencie. Druga ramka danych zawiera listę standardów, które przeprowadziłem z moim eksperymentem - więc jest to kolejna lista leków w oczekiwanym czasie ich wyświetlenia.

Co próbuję zrobić, to uzyskać nazwę odpowiedniego standardu, który zostanie przypisany do właściwego leku w pierwszej ramce danych.

Na przykład lek A był widoczny po 5,5 minutach. Standard Drug A jest widoczny po 5,7 minutach.

Lek B obserwowano po 6 minutach. Używa tego samego standardu co lek A, w 5,7 minuty.

Lek C obserwowano po 6,5 minutach. Używa standardu widzianego po 7 minutach.

Przykład oryginalnych ramek danych:

DF1:
Drug   Time
A     5.5
B     6.0
C     6.5

DF2:
Standard   Time
S1        5.7
S2        7

Kluczem jest to, że chcę, żeby R szukał standardu z najbliższy czas (w kierunku dodatnim lub ujemnym) do jednego ze standardów w DF2, a następnie przypisać nazwę tego standardu (S1, S2) do DF1.

Przykład końcowej ramki danych:

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

Wiem, w jaki sposób mogę uzyskać idealnie dopasowane wartości do przypisania - ale nie jestem pewien, jak sprawić, by R wyszukało najbliższą wartość w DF2 do wartości czasu dla każdego wiersza w DF1.

Odpowiedzi:

1 dla odpowiedzi № 1

Używanie lapply i rbind, podejście nie tak czyste. Jestem pewien, że zobaczymy trochę magii 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)

Dla każdej obserwacji "Czasowej" znajdujemy minimalną bezwzględną obserwację "Standardową" i tworzymy ramkę danych zawierającą zestaw (czas, standard).

Na końcu łączymy wszystkie zestawy ramek danych przez rbind.

DF2$Standard[which.min(abs(DF2$Time - x) )] to znajduje "Standard" z powyższym warunkiem

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