如何使用R

时间:2017-10-08 18:39:09

标签: r

我使用的检验数据提供100-300nm的波长和序列1,意思是:100,101,102,103,... 300。我使用R将数据保存在SQLite中,表名为data

> 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吗?谢谢!

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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))]