2013-02-09 2 views
2

Я очень новичок в R, так что простите меня, если это чрезвычайно простой вопрос. Используя приведенные ниже инструкции, я редактировал вопрос, чтобы, надеюсь, иметь больше смысла.Поиск и сопоставление в фреймах данных

У меня есть кадр d данных, который выглядит, как этот

SAMPLE <-c("blueberry", "broccoli") 
OPT1 <-c("apple", "beef") 
OPT2 <-c("oatmeal", "bacon") 
RESPONSE <- c("oatmeal", "beef") 
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE) 

добавить столбец NA новых данных

d$OPT1.D <- rep("NA",nrow(d)); 

и расстояние матрицы dist

X <-c("blueberry", "beef", "oatmeal", "broccoli") 
blueberry <-c("0", "0.17", "0.09", "0.21") 
beef <-c("0.15", "0", "0.979", "0.75") 
oatmeal <- c("0.09", "0.375", "0", "0.71") 
broccoli <- c("0.25", "0.671", "0.45", "0") 
dist <- data.frame(X,blueberry,beef, oatmeal, broccoli) 

Так что я хочу найдите совпадение строк/столбцов в dist для d$RESPONSE и d$SAMPLE. В новой колонке для d$OPT1.D первая запись должна быть 0.09, что является расстоянием между «овсяной мукой» и «голубикой» в dist. Вторая запись должна быть 0.671, расстояние между «говядиной» и «брокколи».

Надеюсь, что это имеет смысл? Я использовал код ниже, d$OPT1.D <- dist[cbind(d$RESPONSE, d$SAMPLE)], но он вернул текст, а не номер. Большое спасибо.

В целом это похоже, должно быть, довольно простая операция, но после поиска бит я не могу сказать, лучше ли это делать с помощью цикла или пакета FOR, например data.table. Совет будет оценен!

ответ

2

Это специально разработанное для матричной индексации малоизвестная, но очень мощная функция R. Все, что вам нужно, это эта команда (а затем повторите для OPT2).

d$OPT1D <- dist[cbind(d$RESPONSE, d$OPT1)] 

Кстати, полезно включить ваши данные таким образом, чтобы другие могли легко прочитать его. Вот что я сделал, чтобы получить его.

d <- read.table(text="SAMPLE  OPT1  OPT2  RESPONSE  OPT1D  OPT2D 
banana  blueberry oatmeal  oatmeal   NA   NA 
broccoli  beef  bacon  beef   NA   NA", 
       header=TRUE, stringsAsFactors=FALSE) 
dist <- read.table(text="blueberry  beef   oatmeal 
0    0.15   0.09 
0.17   0    0.0872 
0.09   0.0979   0", header=TRUE, stringsAsFactors=FALSE) 
dist <- as.matrix(dist) 
rownames(dist) <- colnames(dist) 



> d 
    SAMPLE  OPT1 OPT2 RESPONSE OPT1D OPT2D 
1 banana blueberry oatmeal oatmeal 0.09 NA 
2 broccoli  beef bacon  beef 0.00 NA 
+0

Благодарим за редактирование @RomanLustrik! – Aaron

2

Ваша первая проблема заключается в том, что типы д являются факторами, которые преобразуются в целые числа (а не символов), когда вы пытаетесь использовать его в качестве индексов в DIST [cbind (D $ ОТВЕТА, d $ OPT1) ]. При вызове data.frame вам нужно использовать strAsAsFactors = FALSE.

d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE) 

Вторая проблема заключается в том, что dist является data.frame и не имеет имен строк. Кроме того, X не должен быть столбцом.

dist <- cbind(blueberry,beef, oatmeal, broccoli) 
rownames(dist) <- colnames(dist) <- X 

Вроде бы оно должно делать то, что вы хотите.

dist[cbind(d$RESPONSE, d$SAMPLE)] 
[1] 0.090 0.671 
+0

также обратите внимание, что ваша матрица расстояний не симметрична, что немного подозрительно. И как на практике на этом сайте вы должны использовать комментарии для общения с людьми, которые отвечают. Если вы понимаете, что ваш вопрос недостаточно ясен, вы должны отредактировать свой вопрос. Но вы не должны публиковать ответ, чтобы задать вопрос. –

Смежные вопросы