【问题标题】:How to make a sequence of values in a factorial dataframe?如何在阶乘数据框中创建一系列值?
【发布时间】:2019-06-13 14:39:38
【问题描述】:

我正在尝试从一个跨越最小值和最大值的序列中获取一个 3 列数据框,该数据框包含两个因素(生成和处理)和 x 值的组合。为什么我要得到一个 6 列的表?

我有一个数据框,其中观察到每个 gen 和 Treat 组合的最大值和最小值。创建一个空数据框以填充循环。从最小值和最大值中获取 100 的序列。然后尝试将所有内容粘贴并存储回空数据框中。

这是我的可重现示例"

gen <- c("gen1", "gen2" , "gen3")
trt <- c("treat1", "treat2")
t1 <- expand.grid(gen, trt)
max.vals <- c(0.005570975, 0.006843775, 0.006046788, 0.005808882, 0.005091197, 0.007763680)
min.vals <- c(-0.002843542 -0.002425798 -0.002187437 -0.002872362 -0.004089794 -0.003156588)
t2 <- data.frame(t1, min.vals, max.vals)
colnames(t2) <- c("gen", "trt", "min.vals", "max.vals")


x.values <- as.data.frame(matrix(nrow = 600, ncol = 3)) #empty dataframe
for (i in 1:6) {
        x.vals <- seq(t2$min.vals[i], t2$max.vals[i], length.out = 100) 
        gen.tret <- paste(t2$gen[i], t2$trt[i], x.vals)
        x.values[i] <- gen.tret
        }

我期望一个 3 列(序列中的 gen、rep 和 x.vals),但我有一个 6 列数据框。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是tidyverse 的选项。按'gen'、'trt'分组得到'min.vals'、'max.vals'的每个元素之间的complete序列

    library(tidyverse)
    t2 %>% 
       group_by(gen, trt) %>%
       complete(min.vals =  seq(min.vals, max.vals, length.out = 100)) %>%
       select(gen, trt, x.vals = min.vals)
    

    map2

    t2 %>%
      transmute(gen, trt, x.vals = map2(min.vals, max.vals, seq, length.out = 100)) %>%
      unnest
    

    【讨论】:

    • 很好的答案!谢谢。我有一个简短的问题来更好地理解代码。完成后 min.vals 的目的是什么?例如,如果我运行:t2 %&gt;% group_by(gen, trt) %&gt;% complete(var.name = seq(min.vals, max.vals, length.out = 100)) %&gt;% select(gen, trt, x.vals = var.name) 它会给我一个错误...Error: by` can't contain join column var.name which is missing from RHS Call rlang::last_error() to see a backtrace`。这是为什么?我认为“min.vals =”只是为序列提供一个名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2020-08-06
    • 2013-11-03
    • 1970-01-01
    • 2021-09-16
    • 2010-10-21
    相关资源
    最近更新 更多