格式化粘贴函数的输出以包括缺少值的NULL

时间:2015-10-23 08:39:38

标签: r paste rodbc

我有一个包含三列(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')"

目前,我还不知道如何格式化此粘贴功能以产生此类输出。

所以我需要帮助。谢谢大家,感谢您的光临。

2 个答案:

答案 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来做到这一点。我们使用pastedo.call(paste行放在一起,参数可以放在listlist(sep=','))中,通过包含(和{{1来格式化字符串将)sprintfcollapse合并为一个字符串。我们可以通过将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...`