我有一个包含三列(a,b,c)的数据集。
a b c
-----------------
63 0
78 0
79 0
10 0
11 0
12 0
13 0
16 0
16 0
16 1 2014-04-24
我试图将这些列中的值插入到R的SQL表中。
我正在使用粘贴功能将数据集中的值传递给SQL语句。
valuestest1 <- paste("(",df$a,",",df$b,",",df$c,")", sep="", collapse=",")
valuestest1
我从这个粘贴函数得到的输出如下:
"(63,0,),(78,0,),(79,0,),(10,0,),(11,0,),(12,0,),(13,0,),(16,0,),(16,0,),(16,1,2014-04-24)"
这不适用于insert语句,因为经过大量的反复试验后,我发现:
1)我需要在缺少值的地方插入NULL,如下所示:
"(63,0,NULL),(78,0,NULL),(79,0,NULL),(10,0,NULL),(11,0,NULL),(12,0,NULL),(13,0,NULL),(16,0,NULL),(16,0,NULL),(16,1,2014-04-24)"
2)我应该用单引号括起日期值,如“2014-04-24&#39;
"(63,0,NULL),(78,0,NULL),(79,0,NULL),(10,0,NULL),(11,0,NULL),(12,0,NULL),(13,0,NULL),(16,0,NULL),(16,0,NULL),(16,1,'2014-04-24')"
目前,我还不知道如何格式化此粘贴功能以产生此类输出。
所以我需要帮助。谢谢大家,感谢您的光临。
答案 0 :(得分:1)
假设这是您的数据并且格式正确,您可以这样:
df <- data.frame(a = c(63, 78, 79, 10, 11, 12, 13, 16, 16, 16), b=c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1), c=c("","","","","","","","","","2014-04-24"), stringsAsFactors=FALSE)
> df
a b c
1 63 0
2 78 0
3 79 0
4 10 0
5 11 0
6 12 0
7 13 0
8 16 0
9 16 0
10 16 1 2014-04-24
继续把你的报价放在第3栏的所有内容中:
df[,3] <- paste("'", df[, 3], "'", sep="")
...并获得:
> df
a b c
1 63 0 ''
2 78 0 ''
3 79 0 ''
4 10 0 ''
5 11 0 ''
6 12 0 ''
7 13 0 ''
8 16 0 ''
9 16 0 ''
10 16 1 '2014-04-24'
现在,处理空的引号:
> df[df=="''"]<-'NULL'
给你
> df
a b c
1 63 0 NULL
2 78 0 NULL
3 79 0 NULL
4 10 0 NULL
5 11 0 NULL
6 12 0 NULL
7 13 0 NULL
8 16 0 NULL
9 16 0 NULL
10 16 1 '2014-04-24'
现在您可以像在问题中那样粘贴:
valuestest1 <- paste("(",df$a,",",df$b,",",df$c,")", sep="", collapse=",")
valuestest1
[1] "(63,0,NULL),(78,0,NULL),(79,0,NULL),(10,0,NULL),(11,0,NULL),(12,0,NULL),(13,0,NULL),(16,0,NULL),(16,0,NULL),(16,1,'2014-04-24')"
答案 1 :(得分:0)
我们可以transform
&#39; c&#39;中的空白元素列,即''
到&#39; NULL&#39;。在这里,我使用ifelse
来做到这一点。我们使用paste
将do.call(paste
行放在一起,参数可以放在list
(list(sep=',')
)中,通过包含(
和{{1来格式化字符串将)
和sprintf
与collapse
合并为一个字符串。我们可以通过将paste
粘贴到外部sprintf
来删除()
步骤。
paste
如果我们需要paste(
sprintf('(%s)',
do.call(paste,
c(transform(df1, c= ifelse(c=='', 'NULL', c)),
list(sep=',')))),
collapse=',')
#[1] "(63,0,NULL),(78,0,NULL),(79,0,NULL),(10,0,NULL),(11,0,NULL),(12,0,NULL),(13,0,NULL),(16,0,NULL),(16,0,NULL),(16,1,2014-04-24)"
的单引号,我们可以更改'2014-04-24'
语句以格式化&#39;日期&#39;使用ifelse
。
sprintf
注意:这提供了OP的帖子中显示的预期结果。此外,它应该工作,即使有100列左右,即我们不需要手动输入
paste(
sprintf('(%s)',
do.call(paste,
c(transform(df1, c= ifelse(c=='', 'NULL', sprintf("'%s'",c))),
list(sep=',')))),
collapse=',')
#[1] "(63,0,NULL),(78,0,NULL),(79,0,NULL),(10,0,NULL),(11,0,NULL),(12,0,NULL),(13,0,NULL),(16,0,NULL),(16,0,NULL),(16,1,'2014-04-24')"
paste("(",df$a,",",df$b,",",df$c,...., df$xyz...`