【问题标题】:If Column contains "-" at the end of a value, remove the "-" at the end - sqldf如果 Column 在值的末尾包含“-”,则删除末尾的“-” - sqldf
【发布时间】:2019-03-08 06:52:58
【问题描述】:

我有一个如下的数据框:

    ColA    ColB
   djdn-       3
   dn-dn       5
   ndmc-       8
nd-nd-md       9

预期输出:

    ColA    ColB   New_Col
   djdn-       3      djdn
   dn-dn       5     dn-dn
   ndmc-       8      ndmc
nd-nd-md       9  nd-nd-md

使用 sqldf,如果值末尾存在“-”,我想删除它。

这是我尝试的代码:

library(sqldf)
df_new<- sqldf("select CASE(RIGHT([ColA], 1) = '-', LEFT([ColA], LEN([ColA])-1), 
[ColA]) [New_Col] from df")

Error in result_create(conn@ptr, statement) : near "(": syntax error

【问题讨论】:

  • 请编辑问题以指定(可能带有标签)您正在查询的 RDBMS。
  • gsub("-$", "", txt)
  • 感谢 @M-M 不幸的是它需要在 sqldf 中

标签: sql r sqldf


【解决方案1】:

我想你在找rtrim

library(sqldf)
df_new<- sqldf("select ColB,rtrim(ColA,'-') as ColA from df")
  ColB     ColA
1    3     djdn
2    5    dn-dn
3    8     ndmc
4    9 nd-nd-md

【讨论】:

  • 这将从值的右端删除 所有 个连续的“-”字符(零、一、三、十七、任意数量)。这与问题所问的不同;我不知道这是否重要。 @nak5120 这会改变答案吗?
【解决方案2】:

虽然使用rtrim 似乎更容易,但这里有一个使用substr 的解决方案: sqldf使用SQLite,没有RIGHTLEFT函数,所以改用SUBSTR函数,LEN函数为LENGTH

library(sqldf)
df_new <- sqldf("select df.*, 
               CASE 
                WHEN substr(ColA, length(ColA),1) = '-' THEN substr(ColA, 1, length(ColA)-1) 
               ELSE ColA
               END AS New_Col from df")

【讨论】:

  • 问题:sqldf 是否支持REGEXP
  • 我没有尝试在sqldf中使用regex,但是之前有问过这个问题stackoverflow.com/questions/33026213/…
  • 感谢您的回答。也许是时候对sqldf进行一次重大更新了
【解决方案3】:

要匹配“值末尾包含‘-’”,请使用(我假设是 PostgreSQL)pattern match

SELECT
    col_a
FROM df
WHERE (col_a LIKE '%-')

然后,要获取不带最终字符(您现在知道是“-”字符)的值,请使用string manipulation function

SELECT
    left(col_a, -1) AS col_a_truncated
FROM df
WHERE (col_a LIKE '%-')

【讨论】:

  • 不幸的是,我得到了同样的错误 - 这是我根据你的回答的新代码 - df2&lt;- sqldf("SELECT left([col_a], -1) AS col_a_truncated FROM df WHERE ([col_a] LIKE '%-") 错误是 Error in result_create(conn@ptr, statement) : near "(": syntax error
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多