【问题标题】:How to create a column with each number in a row 10 times smaller than the previous number?如何创建一行中每个数字比前一个数字小 10 倍的列?
【发布时间】:2019-04-27 21:15:02
【问题描述】:

我必须创建一个数据框,其中一列填充了 runif 数字,但一行中的每个数字都比前一个数字小 10 倍(这应该做 5 次)。因此,如果第一行中的第一个数字是 5,则第二个最后是 0.5、0.05、0.005 和 0.0005。例如,在下面的代码中,已经制作了数据框,我应该像上面解释的那样替换 OD 列中的前五个值。

levels <- c("ref", "treat", "control")
x <- as.factor(labels)
a <- levels[x]
values <- runif(25,min=0,max=25)
my.data <- data.frame(labels = a, OD=values)

【问题讨论】:

    标签: r


    【解决方案1】:

    我会给你一个详细的答案。 你想让每个数字比前一个小 10 倍, 可以通过以下方式完成:

    runif(1, min=0, max=25) / 10 ^ (0:4)
    

    我们在指数中包含 0 以保留原始数字。

    然后你想将该操作应用于values中的每个值, 所以你可以使用sapply

    sapply(values, "/", 10 ^ (0:4))
    

    但是,当每个结果都是一个向量时,sapply 会按列绑定它们, 所以我们用t 转置结果。 既然你想要一个数据框,你可以简单地结束:

    data.frame(labels=a, t(sapply(values, "/", 10 ^ (0:4))))
    

    之后可能会使用colnames 调整列名。

    顺便说一句,您的示例不可重现,labels 未定义。

    【讨论】:

    • 替代sapply 并转置:data.frame(outer(values, 1/(10^(0:4))))
    • 哦,是的,我总是忘记outer。也可以是outer(values, 10^(0:4), "/")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多