2014-01-06 2 views
0

Я хотел бы использовать R для основной цели базы данных с двумя кадрами данных: первый кадр данных представляет собой список лиц с различными функциями:базы данных, как основное использование

data = data.frame("individual"=c("Steve","Bob","Simon","Lisa"), 
        "feature1"=c(1,2,2,3), 
        "feature2"=c(3,4,1,NA)) 

второй кадр данных имеет особенности descritions :

description = data.frame("feature"=c(1,2,3,4,NA), 
         "label"=c("foot","golf","curling","ski","No answer")) 

Моя цель состоит в том, чтобы сделать третий фрейм данных с именами физических лиц с последующим их описанием характеристики:

Steve foot curling 
Bob golf ski 

и т. Д.

+4

[Удаление] (http://stackoverflow.com/q/20947409/324364) и перепроведение вашего вопроса не в том, чтобы идти о это. Я ценю, что вы добавили данные в свой вопрос, но StackOverflow вообще не увлекается вопросами, которые являются чуть ли не описанием проблемы и ожиданием решения. Если ** у вас ** есть частичное решение, которое не работает, мы будем рады помочь. В противном случае этот вопрос по-прежнему нуждается в дополнительной работе. – joran

+0

Я согласен, что этот вопрос может использовать некоторую работу. Но чтобы ответить на ваш вопрос, попробуйте использовать функцию 'merge'. Вам придется сделать это дважды, один раз для «feature1» и снова для «feature2». Однако я не уверен, как передать значение «NA» с помощью этого подхода. – rrs

ответ

2

Для этой задачи можно использовать match.

cbind(data[1], as.data.frame(lapply(data[-1], function(x) 
           description$label[match(x, description$feature)]))) 

    individual feature1 feature2 
1  Steve  foot curling 
2  Bob  golf  ski 
3  Simon  golf  foot 
4  Lisa curling No answer 
4

sqldf Попробуйте три пути присоединиться:

library(sqldf) 

data[is.na(data)] <- "NA" 
description[is.na(description)] <- "NA" 

sqldf("select d1.individual, d2.label, d3.label 
     from data d1 
     left join description d2 on d1.feature1 = d2.feature 
     left join description d3 on d1.feature2 = d3.feature" 
) 

Выход:

individual label  label 
1  Simon golf  foot 
2  Steve foot curling 
3  Bob golf  ski 
4  Lisa curling No answer 

индексации

Это решение предполагает, что мы запустили два <- "NA" строк выше.

labels <- with(description, setNames(label, feature)) 
with(data, 
    data.frame(individual, labels[feature1], labels[feature2], stringsAsFactors = FALSE) 
) 

, который дает выход:

individual labels.feature1. labels.feature2. 
3  Steve    foot   curling 
4   Bob    golf    ski 
1  Simon    golf    foot 
NA  Lisa   curling  No answer 

REVISED:

  • Используйте левую присоединиться.
  • Обрабатывать NA как обычные значения.
  • Добавить второе решение.
0

Просто для удовольствия третьего подхода с использованием plyr и reshape2

require(reshape2) 
require(plyr) 
dcast(join(melt(data, id = "individual", value.name = "feature"), description), 
     individual ~ variable, value.var = "label") 

    individual feature1 feature2 
1  Bob  golf  ski 
2  Lisa curling No answer 
3  Simon  golf  foot 
4  Steve  foot curling 
Смежные вопросы