2014-12-13 4 views
1

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

#make blank data frame, label the columns and rows 
data <- data.frame(matrix(0, ncol = 4, nrow = 4)) 
colnames <- seq(from = 1, to = 4, by = 1) 
names(data)<- sprintf("%.0f", colnames) 
rownames <- seq(from=3, to=12, by=3) 
rownames(data) <- sprintf("%.0f", rownames) 

Мой вопрос, учитывая выше кадр данных, как я могу заполните кадр данных каждой ячейкой, принимающей значение метки строки, умноженное на метку столбца NOT, используя цикл for, как я уже указывал в следующем коде. Я хотел бы знать, как это сделать, используя векторизованный метод, и не нужно перебирать каждую отдельную ячейку.

for(i in 1:nrow(data)){ 
    for(j in 1:ncol(data)){ 
     data[i,j] <- as.numeric(rownames(data)[i])*as.numeric(colnames(data)[j]) 
    } 
} 

ответ

1

Вы можете конвертировать rownames и colnames векторы numeric с и взять их внешний продукт, как это:

> as.numeric(rownames(data)) %o% as.numeric(colnames(data)) 
    [,1] [,2] [,3] [,4] 
[1,] 3 6 9 12 
[2,] 6 12 18 24 
[3,] 9 18 27 36 
[4,] 12 24 36 48 

и внести соответствующие изменения, если это необходимо:

data2 <- data.frame(
    as.numeric(rownames(data)) %o% 
    as.numeric(colnames(data))) 
names(data2) <- names(data) 
## 
> data2 
    1 2 3 4 
1 3 6 9 12 
2 6 12 18 24 
3 9 18 27 36 
4 12 24 36 48 

Там в a (менее компактная) версия %o%, которая не ограничивает вас внешним pro Канал:

outer(as.numeric(rownames(data)), 
     as.numeric(colnames(data)), 
     FUN=function(x,y){ x*(2/3) + y/3 }) 
     [,1]  [,2] [,3]  [,4] 
[1,] 2.333333 2.666667 3 3.333333 
[2,] 4.333333 4.666667 5 5.333333 
[3,] 6.333333 6.666667 7 7.333333 
[4,] 8.333333 8.666667 9 9.333333 

В случае по умолчанию outer, FUN="*", что эквивалентно использованию %o%.

+0

Умный раствор. Что делать, если мне нужно выполнить другую функцию имен столбцов и имен строк? Например, если я определил функцию a (x, y), как я должен ввести правильное имя строки и имя столбца для этой функции? – bill999

+0

Трудно сказать, что решение будет меняться в зависимости от того, что такое 'a (x, y)'; хотя, конечно, возможно, будет применен векторный подход. Вообще говоря, «mapply», вероятно, будет хорошей отправной точкой - независимо от того, будет ли это «лучший» подход, будет зависеть от конкретной операции. – nrussell

+1

ОК. Думаю, я подумал об этом немного. Это всего лишь вариация вашего ответа. Благодаря! – bill999

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