【问题标题】:creating a dataframe创建数据框
【发布时间】:2012-09-11 01:57:57
【问题描述】:

我的数据是这样设置的:

site    date      amb   ppm1   ppm2   ppm3   time0   time1   time2   time3
A       5/6/12     350   370    380   385     0       3        6       9

我需要它的格式有 2 列(一列是专注,另一列是时间)

conc   time
350      0
370      3
380      6
385      9

这样我就可以对其进行回归分析。或者帮助如何在原始设置上运行回归会很棒。

【问题讨论】:

    标签: r dataframe regression


    【解决方案1】:

    使用您的示例数据,并假设您的 data.frame 称为“mydf”,您可以为每个“组”列使用 stack 以获得您显示的输出:

    setNames(data.frame(stack(mydf[, grep("^ppm|^amb", names(mydf))])[-2], 
                        stack(mydf[, grep("^time", names(mydf))])[-2]), 
             c("conc", "time"))
    #   conc time
    # 1  350    0
    # 2  370    3
    # 3  380    6
    # 4  385    9
    
    • 使用了grep,作为一个示例,如果您有许多类似命名的列并且不想计算来识别它们的列索引。如果这确实代表您的数据,stack 也可能只是stack(mydf[, 3:6])[-2]stack(mydf[, 7:10])
    • setNames 只是一个方便的函数,用于重命名输出中的列名。
    • [-2] 只是从每个 stack 命令中删除第二列(这是从中获取值的列名的列)。

    如果您不介意将“abm”的变量名更改为“ppm0”,另一种选择是使用reshape

    names(mydf)[3] <- "ppm0"
    reshape(mydf, direction = "long", idvar = 1:2, 
            timevar = "measure", varying = 3:ncol(mydf), sep = "")
    #            site   date measure ppm time
    # A.5/6/12.0    A 5/6/12       0 350    0
    # A.5/6/12.1    A 5/6/12       1 370    3
    # A.5/6/12.2    A 5/6/12       2 380    6
    # A.5/6/12.3    A 5/6/12       3 385    9
    

    当然,您可以非常轻松地删除前三列。

    【讨论】:

      【解决方案2】:

      如果您的数据是单个向量:

      > mydata <- c("A", "5/6/12", 350, 370, 380, 385, 0, 3, 6, 9)
      

      您的名字已添加:

      > names(mydata) <- c("site", "date", "amb" ,"ppm1","ppm2","ppm3","time0","time1","time2","time3")
      

      会有点像你上面描述的:

      > mydata
        site     date      amb     ppm1     ppm2     ppm3    time0    time1    time2    time3 
        "A"  "5/6/12"    "350"    "370"    "380"    "385"      "0"      "3"      "6"      "9"
      

      要改造它,你可以这样做:

      > data.frame(conc=mydata[3:6],time=mydata[7:10])
      

      这会导致

             conc time
        amb   350    0
        ppm1  370    3
        ppm2  380    6
        ppm3  385    9
      

      【讨论】:

      • 这是一个非常重要的假设,即数据是单个向量。从您的示例输入中可以看出,所有内容都被强制转换为字符,而它们不在 OPs 数据中。
      • @AnandaMahto 这只是我尝试重现 OP 数据结构的方式,他没有指定从哪里复制数据输入。如果引号很麻烦,您可以将它们添加为factor。我只添加这个以防它可能像那样简单的问题,一个替代方案。
      • 没问题。有替代品总是好的。我的观点主要是您在回答中做出了很大的假设。不幸的是,该 OP 似乎是一个打了就跑的用户,所以我们可能永远不知道他们数据的实际结构的真相:)
      • 另外,提醒一下,我通常避免命名对象t,因为这可能会给经常使用矩阵并需要transpose 数据的人带来混乱的代码。在大多数情况下,功能不会受到影响,但易读性可能会受到影响。
      • 你说得有道理...我只是很快就写出来了...我认为在 R 中将对象和函数命名为相同的名称不应该造成任何伤害...但为避免混淆,我将更改答案中的名字 =)
      【解决方案3】:

      您应该使用正则表达式来拆分字符串以获得两个向量(浓度和时间)。如果您使用的是 R,您只需调用

      data.frame(concentration=concentration,time=time) 
      

      在你的两个向量上。

      【讨论】:

        猜你喜欢
        • 2018-07-14
        • 2020-02-26
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        相关资源
        最近更新 更多