我有以下data.frame data
:
data <- data.frame(matrix(0, ncol=4, nrow=4))
colnames <- seq(from = 6, to = 3, by = -1)
names(data)<- sprintf("%.1f", colnames)
rownames <- seq(from=5, to=2, by=-1)
rownames(data) <- sprintf("%.0f", rownames)
我有两个向量,a
和b
:
a <- seq(11, 5, -1)
b <- seq(0, 30, 5)
a
表示列和行标题可以采用的所有可能的总和。例如,最西北的单元格为6+5=11
。
b
表示我想要填充到data.frame中的值。订单对应于a
的顺序。例如,data[1,1]
(行和列名称总和为11
)应采用值0
。 data[1,2]
和data[2,1]
都应该使用值5
。
我将如何做到这一点?
我最初的想法是循环遍历所有单元格并检查它们的行+列名称总和是什么,然后检查此总和是否在a中,如果是,则抓住位置然后转到b并根据位置获取值然后填写它。这是在正确的轨道上吗?
答案 0 :(得分:1)
试试这个:
g <- outer(as.numeric(colnames(data)), as.numeric(rownames(data)), "+")
g <- matrix(sapply(1:length(g), function(x) b[which(a==g[x])]), nrow=4)
# [,1] [,2] [,3] [,4]
#[1,] 0 5 10 15
#[2,] 5 10 15 20
#[3,] 10 15 20 25
#[4,] 15 20 25 30
#For a data frame:
g<- data.frame(g, row.names=rownames(data)); names(g) <- colnames(data)
答案 1 :(得分:-1)
所以(未经测试),也许以下内容可行。
output <- outer(X=a, Y=b, FUN="+")
这将创建一个数组/矩阵。当然,如果需要,可以强制使用data.frame,但我不确定为什么你会在上面的例子中这样做。