【问题标题】:How to fill in data frame based on vectors如何根据向量填充数据框
【发布时间】:2015-06-25 17:17:11
【问题描述】:

我有以下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)

我有两个向量,ab

a <- seq(11, 5, -1)
b <- seq(0, 30, 5)

a 表示列和行标题可以采用的所有可能的总和。例如,最西北的单元格是6+5=11

b 表示我要填充到data.frame 中的值。顺序对应a的顺序。例如,data[1,1](行名和列名之和为11)应采用值0data[1,2]data[2,1] 都应该具有 5 的值。

我该怎么做呢?

我最初的想法是遍历所有单元格并检查它们的行+列名称总和是什么,然后检查这个总和是否在 a 中,如果是,则获取位置,然后转到 b 并根据位置获取值然后填写。这是在正确的轨道上吗?

【问题讨论】:

  • 我不知道为什么你想要一个 data.frame 而不是在这个例子中保留为矩阵。这样做似乎没有任何优势。对于您的问题,我建议您查看“外部”功能。

标签: r if-statement vector


【解决方案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)

【讨论】:

    【解决方案2】:

    所以(未测试),也许以下方法会起作用。

    output <- outer(X=a, Y=b, FUN="+")
    

    这将创建一个数组/矩阵。当然,如果您需要,可以强制转换为 data.frame,但我不确定您为什么在上面的示例中这样做。

    【讨论】:

    • 不知道为什么这是几分钟后发布的公认解决方案的核心,为什么会被否决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多