2017-10-08 50 views
0

在SQLite上按順序檢索列我使用一個檢測器數據,提供100-300nm的波長序列1,意思是:100,101,102,103,... 300。我保持數據SQLite中使用R,以表的名稱作爲data如何使用R

> data 
obs 100 101 102 103 104 ... 300 
    1 0.1 0.1 0.9 0.1 0.2  0.5 
    2 0.8 1.0 0.9 0.0 1.0  0.4 
    3 0.7 0.8 0.3 0.8 0.5  0.2 
    4 0.7 0.1 0.2 0.4 0.7  0.6 
    5 0.9 0.4 0.6 0.6 0.6  0.4 
    6 0.7 0.1 0.6 0.7 0.9  0.9 

我對以檢索與序列4僅在啓動100,則表示列號:100,104,108,...

我試過使用sqldf("select 100, 104, 108, ... from data"),但似乎沒有效率的工作。有人可以幫助使用R嗎?謝謝!

回答

0

你可以在sqldf裏面使用paste()來讓事情變得更簡單。所以基本思想是:

sqldf(paste("select", 
      paste0("`",seq(100,300,4),"`",collapse=", "), 
      "from data")) 

帶數字名稱的列或表通常需要用反引號包圍。所以這就是爲什麼我已經調整的語句來找出`100`,而不是100

發言全文(上述簡化的)看起來是這樣的:

[1] "select `100`, `104`, `108`, `112`, `116`, `120`, `124`, `128`, `132`, `136`, 
      `140`, `144`, `148`, `152`, `156`, `160`, `164`, `168`, `172`, `176`, 
      `180`, `184`, `188`, `192`, `196`, `200`, `204`, `208`, `212`, `216`, 
      `220`, `224`, `228`, `232`, `236`, `240`, `244`, `248`, `252`, `256`, 
      `260`, `264`, `268`, `272`, `276`, `280`, `284`, `288`, `292`, `296`, 
      `300` from data" 
+0

感謝@www你的回答,它的工作!任何方式,如果它不在SQLite中,意味着我想運行一個小數據,比如說'data <-read.csv(「test.csv」,header = TRUE)',列名與'100,102,...'相同。 ..,300'。如何從序列4的特定列名中選擇數據框?我在這裏試過但不工作,'new <-data [,c(paste0(「'X」,seq(550,555,2),''「,collapse =」,「)))' – Honstel

+0

@Honstel - 已經在R中,並且你正在使用read.csv,它將X添加到每個數字列名稱的開頭,然後你可以使用類似於:data [,c(paste0(「X」,seq(100,104,4) ))] – www

+0

thans @www其作品 – Honstel

0

sqldf加載gsubfn包這對於提供fn$處理字符串插值。 fn$可以作爲任何函數調用的前綴,例如,使用fn$sqldf("... $var ..."),然後用$var替換它的值。

請注意,select 100選擇數字100而不是名爲100的列,因此我們使用select [100]來代替。

cn <- toString(sprintf("[%d]", seq(100, 300, 4))) # "[100], [104], ..." 
fn$sqldf("select $cn from data") 

,或者如果我們想在一個變量來創建SQL語句,然後運行它:

sql <- fn$identity("select $cn from data") 
sqldf(sql) 

注意,這是很容易在直線R鍵做的一樣好:

data[paste(seq(100, 300, 4))] 
+0

感謝它的工作 – Honstel