2014-11-30 3 views
1

Я нахожу это озадачивающим, что я не могу выполнить простую матричную арифметику в R. Неужели это невозможно? Я хочу взять значения в 1 фрейм данных и вычесть их по всем столбцам в другой фреймворке. Похоже, это должно быть легко, но я ничего не нахожу, хотя есть «психологический» пакет, который как функция, но не дает ожидаемых результатов. Также кажется, что это не обязательно. Какие-нибудь советы. Очень признателен.Базовая матрица/data.frame арифметика в R

> NROW(arData1[c(gsub(" ", ".",portfolio1), "benchmark")]) 
[1] 51 
> NCOL(arData1[c(gsub(" ", ".",portfolio1), "benchmark")]) 
[1] 4 
> NROW(arData1[gsub(" ", ".", treasuries)]) 
[1] 51 
> NCOL(arData1[gsub(" ", ".", treasuries)]) 
[1] 1 

ExRet1 <- arData1[c(gsub(" ", ".",portfolio1), "benchmark")] - arData1[gsub(" ", ".", treasuries)] 
Error in Ops.data.frame(arData1[c(gsub(" ", ".", portfolio1), "benchmark")], : 
    - only defined for equally-sized data frames 
+2

Я думаю, что сообщение об ошибке довольно ясно, нет? –

ответ

4

Проблема связана с тем, как вы индексируете.

df["colname"] 

извлекает столбец colnameкак кадр данных. Если вы вычитаете два кадра данных, R делает это по столбцам и по строкам, поэтому оба кадра данных должны иметь одинаковое количество столбцов.

Однако, вы можете извлечь colname как вектор с использованием [[, как в

df[["colname"]] 

Если вычесть вектор из кадра данных, что вектор вычитается из каждого столбца в df.

df <- data.frame(x=1:5,y=11:15,z=21:25,A=31:35) 
df[c("x","y","z")] - df["A"] 
# Error in Ops.data.frame(df[c("x", "y", "z")], df["A"]) : 
# - only defined for equally-sized data frames 

df[c("x","y","z")] - df[["A"]] 
#  x y z 
# 1 -30 -20 -10 
# 2 -30 -20 -10 
# 3 -30 -20 -10 
# 4 -30 -20 -10 
# 5 -30 -20 -10 
Смежные вопросы