2012-09-18 216 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

相關問題