以下代码使数据框的值为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])
}
}
答案 0 :(得分:1)
您可以将rownames
和colnames
向量转换为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
默认情况下为outer
,FUN="*"
,相当于使用%o%
。