2012-09-18 218 views
3

我的数据被设置为这样:创建一个数据帧

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 

,这样我可以格式对其进行回归。或者帮助如何对原始设置进行回归会很好。

回答

1

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

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

您的两个向量创建一个数据帧。

3

使用您的样本数据,并假设你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命令(它是从中取值的列名称列)中删除第二列。

另一种选择,如果你不介意改变“反导”的变量名“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 
+0

这是你犯了一个非常重大的假设,该数据是单一载体。从您的示例输入中可以看出,所有内容都被强制转换为字符,但它们不在OP数据中。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto这只是我尝试重现OP的数据结构的方式,他没有指定他从哪里复制数据输入。如果引号很麻烦,可以将它们添加为“factor”。我只是补充一点,以防它可能是一个简单的问题,作为替代方案。 – user2276428

+0

没问题。有替代品永远是好事。我的观点主要是你在回答中做出了一个很大的假设。不幸的是,OP似乎是一个屡试不爽的用户,所以我们可能永远不知道他们的数据的实际结构的真相:) – A5C1D2H2I1M1N2O1R2T1

相关问题