如何在没有for循环的情况下执行此操作

时间:2014-12-13 20:46:17

标签: r for-loop vector dataframe row

以下代码使数据框的值为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)

我的问题是,鉴于上述数据框架,我如何填写数据框,每个单元格采用行标签的值乘以列标签,而不是使用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 个答案:

答案 0 :(得分:1)

您可以将rownamescolnames向量转换为numeric s并将其外部产品转换为:

> 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

%o%版本(不太紧凑)不会限制您使用外部产品

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

默认情况下为outerFUN="*",相当于使用%o%