我使用的检验数据提供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吗?谢谢!
答案 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))]