2013-03-02 4 views
1

В R у меня есть 2 кадра данных «df1» и «df2». Df1 и df2 следующие.умножение двух кадров данных

>df1 
    date  value 
1 1990-10-10 3 
2 1990-10-11 2.3 
3 1990-10-12 2.5 

>df2 
    date  value 
1 1990-10-10 3 
2 1990-10-11 2 
3 1990-10-12 2 

мне нужен третий кадр данных «DF3», который содержит одни и те же имена столбцов как df1 и df2. Но поле значений должно быть произведением значений в df1 и df2. Я ожидаю следующий вывод

>df3 
    date  value 
1 1990-10-10 9 
2 1990-10-11 4.6 
3 1990-10-12 4 

Можно ли в R?

+2

Я предполагаю, что на выходе «df3» вы предоставили опечатку. – A5C1D2H2I1M1N2O1R2T1

ответ

4

Если все даты совпадают, то вы можете просто использовать:

df3 <- df1 
df3$value <- as.numeric(as.character(df3$value)) 
df3$value <- df3$value * as.numeric(as.character(df2$value)) 

Если даты НЕ идентичны в двух data.frames, пожалуйста, используйте @MatthewLundberg ответ ниже

+0

все даты равны. Но отображается предупреждающее сообщение. Предупреждение: В Ops.factor (значение df3 $, значение df2 $): * не имеет смысла для факторов –

+0

, а поле значения становится NA –

+0

, тогда ваши значения являются факторами, а не числовыми. Вам просто нужно сначала их преобразовать;) –

3

Может быть, вы можете merge два первых data.frame с последующим продолжением transform:

> temp <- merge(df1, df2, by = "date") 
> temp 
     date value.x value.y 
1 1990-10-10  3.0  3 
2 1990-10-11  2.3  2 
3 1990-10-12  2.5  2 
> transform(temp, Prod = value.x * value.y) 
     date value.x value.y Prod 
1 1990-10-10  3.0  3 9.0 
2 1990-10-11  2.3  2 4.6 
3 1990-10-12  2.5  2 5.0 

Здесь, поскольку оба data.frame s имеют одинаковые имена столбцов, я указал, что мы хотим объединить только переменную «date», чтобы переменные «значение» присутствовали в «temp» data.frame.

+1

@flodel, спасибо за редактирование. – A5C1D2H2I1M1N2O1R2T1

+0

сэр. Поле значений обоих кадров данных является символом. Таким образом, этот код показывает некоторую ошибку. У меня очень мало опыта в языке R.So, пожалуйста, помогите мне. –

8

«Слияние» длинный путь с rbind и использовать aggregate для производства продукции:

aggregate(value ~ date, data=rbind(df1,df2), FUN=prod) 
##   date value 
## 1 1990-10-10 9.0 
## 2 1990-10-11 4.6 
## 3 1990-10-12 5.0 

Если у вас есть режим factor для value столбцов кадров данных, вам придется конвертировать в character затем numeric для извлечения значения:

df1$value <- as.factor(df1$value) 
df2$value <- as.factor(df2$value) 

aggregate(as.numeric(as.character(value)) ~ date, data=rbind(df1,df2), FUN=prod) 
##   date as.numeric(as.character(value)) 
## 1 1990-10-10        9.0 
## 2 1990-10-11        4.6 
## 3 1990-10-12        5.0 

Вы также можете конвертировать с as.numeric(levels(value))[value]. См. ?factor.

+1

Это довольно умно.+1 – A5C1D2H2I1M1N2O1R2T1

+0

сэр. Поле значений обоих кадров данных является символом. Таким образом, этот код показывает некоторую ошибку. У меня очень мало опыта в языке R.So, пожалуйста, помогите мне. –

+0

'фактор' вы имеете в виду? Я отредактирую. –

2

После устранения Вас проблемы с df1 и df2, имеющие «значения» фактора типа, который действительно коснуться вы должны сделать, прежде чем пытаться это, вы можете сделать только это:

df3 <- data.frame(data=df1$date, value=df1[ ,"value"]*df2[ ,"value"]) 

Превращение факторов, которые должны be numeric рассматривается в R-FAQ: FAQ 7.10

+0

работает ** если ** все даты являются общими в обоих кадрах данных, так что '' df1 $ value'' и '' df2 $ value'' имеют одинаковую длину, иначе выдает ошибку. – PatrickT

+1

Да. И в комментариях к другим вопросам стало очевидно (3 года назад), что ОП имеет серьезные проблемы с управлением данными, связанными с факторами. Вопрос был бы намного быстрее рассмотрен с примерами, представленными с помощью dput(), и включая любую дополнительную сложность, поскольку, по вашему мнению, может потребоваться внимание. –

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