【问题标题】:Is there a better way to write this R if statement有没有更好的方法来编写这个 R if 语句
【发布时间】:2021-12-28 14:47:32
【问题描述】:

我有一段代码可以根据数据框行的列创建 SQL 查询:

a <- c("a1")
b <- c("b1")
c <- c("c1")
df <- data.frame(a, b, c)

query = "INSERT INTO table (a, b, c) VALUES ("

for (j in 1:ncol(df)) {
  if (j < ncol(df)) {
    query <- paste0(query, df[1, j], ", ")  
  } else {
    query <- paste0(query, df[1, j], ");")
  }
}

关键是我必须在元素之间插入一个逗号,但在最后一个元素之后没有逗号,这样查询才能正常工作。

这是我想要的:

query = "INSERT INTO table (a, b, c) VALUES ("a1", "b1", "c1");"

你有什么更简单的写法的想法吗?

【问题讨论】:

  • 您可以使用collapse 参数到paste 在项目之间放置标点符号,例如paste0(df[i, ], collapse = ", ").

标签: r


【解决方案1】:

我们假设:

  1. 即使问题指的是冒号,元素之间也需要逗号
  2. df_layeri 在问题中使用但未定义。我们假设显示的输出是我们想要的,df 在问题中只有一行,idf_layer 可以忽略。

1) 使用sprintfshQuotetoStringshQuote(df, "cmd") 在 Windows 上可以选择缩短为 shQuote(df)

s <- sprintf('INSERT INTO table (a, b, c) VALUES (%s);', 
  toString(shQuote(df, "cmd")))
cat(s, "\n")
## INSERT INTO table (a, b, c) VALUES ("a1", "b1", "c1"); 

2) 或者这个变体也可以插入列名

s2 <- sprintf('INSERT INTO table (%s) VALUES (%s);', 
  toString(names(df)), toString(shQuote(df, "cmd")))
cat(s2, "\n")
## INSERT INTO table (a, b, c) VALUES ("a1", "b1", "c1"); 

注意

输入是

df <- data.frame(a = "a1", b = "b1", c = "c1")

【讨论】:

  • 感谢您的回答。你是对的,我想在元素之间插入一个逗号,并且 df_layer = df (我简化了我的代码但忘记了这个元素)
【解决方案2】:
 paste0(
      'INSERT INTO TABLE (a, b, c) VALUES ("', 
      paste(df$a, df$b, df$c, sep = '", "'), 
      '")'
    )

【讨论】:

    【解决方案3】:

    我认为在您的情况下仅使用粘贴功能可以很好地工作我使用折叠参数来指定分隔符并只是添加了另一个解析字符串的末尾我只是更改了字符串分隔符以启用“内部”的使用字符串。

    b <- c("b1")
    c <- c("c1")
    df <- data.frame(a, b, c)
    i <- 1
    query = 'INSERT INTO table (a, b, c) VALUES ("'
    
    
    df
    paste0(query,paste(df[i,], collapse = '", "'),'");')
    

    如果你愿意,你可以对列名做同样的事情

    b <- c("b1")
    c <- c("c1")
    df <- data.frame(a, b, c)
    i <- 1
    query = 'INSERT INTO table ('
    query2 = ') VALUES ("'
    
    colnames(df)
    paste0(query,paste(colnames(df),collapse=", "),query2,paste(df[i,], collapse = '", "'),'");')
    

    【讨论】:

    • 谢谢,它是完全自动的
    【解决方案4】:

    您可以像这样加入所有值:

    paste(df[1,], collapse = '", "')
    

    在您的示例中,它看起来像这样:

    a <- c("a1")
    b <- c("b1")
    c <- c("c1")
    df <- data.frame(a, b, c)
    
    query = "INSERT INTO table (a, b, c) VALUES ("
    query <- paste0(query, paste(df[1,], collapse = '", "'), ");")
    
    

    【讨论】:

    • 谢谢你,这很好用!
    【解决方案5】:

    我喜欢使用 glue 包,但我强烈建议将 glue_data_safe() 函数用于需要用户输入的任何面向外部的东西。

    df = data.frame(a = "a1", b = "b1", c = "c1")
    table = "(a, b, c)"
    glue::glue("insert into {table} values ({paste(df[1,], collapse = ',')})")
    
    > "insert into (abc) values (a1,b1,c1)"
    
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多