2017-10-08 46 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