paste0正在将所有内容转换为字符

时间:2019-02-11 10:39:28

标签: r string

我有一个R数据帧,其中包含所有类型的混合数据类型,例如Factor,int和POSIXct变量。我想连接所有变量并合并它们而不更改其格式。

我的最终输出应如下所示

('a', 2 ,'2019-02-11 15:57:56')('b', 3 ,'2019-02-11 15:57:56')

使用paste0时,它将所有内容转换为字符。在此方面需要您的帮助。除了paste0之外,还有其他选择可以组合所有内容并像上面一样获得输出。

library(lubridate)
library(dplyr)
dat <- data.frame(id = letters[1:2], x = 2:3, date = now())
dat
str(dat)
'data.frame':   2 obs. of  3 variables:
 $ id  : Factor w/ 2 levels "a","b": 1 2
 $ x   : int  2 3
 $ date: POSIXct, format: "2019-02-11 15:57:56" "2019-02-11 15:57:56"

dat[1,]
  id x                date
1  a 2 2019-02-11 15:57:56

当前我正在使用它,但是给出了不希望的结果。

paste0('(',paste0(dat[1,],collapse = "','"), ')')
[1] "(1','2','1549880876.5498)"

2 个答案:

答案 0 :(得分:1)

我现在意识到了您的意思-您希望在字符串中引用字符类型的变量,而其他变量则不要。有两个问题-首先,您使用','崩溃的方式是在所有内容上加上引号。其次,创建数据框的方式是将日期转换为双精度,将字母转换为整数:

> library(lubridate)
> library(dplyr)
> dat <- data.frame(id = letters[1:2], x = 2:3, date = now())
> typeof(dat$id[1])
[1] "integer"
> typeof(dat$date[1])
[1] "double"
>

因此很难以编程方式检测到您的意思是这些都是字符串。使用I来确保保留字符,并使用format来确保日期是字符串(它有选项,但我没有使用它们):

> dat <- data.frame(id = I(letters[1:2]), x = 2:3, date = I(format(now())))
> dat
  id x                date
1  a 2 2019-02-11 15:01:52
2  b 3 2019-02-11 15:01:52
> typeof(dat$date[1])
[1] "character"
> typeof(dat$id[1])
[1] "character"

现在,数据框具有正确的类型,让我们在粘贴之前准备好它,以引用最后要引用的内容:

> as.data.frame(lapply(dat,function(x) { if (is.character(x)) paste0("'",x,"'") else x }))
   id x                  date
1 'a' 2 '2019-02-11 15:01:52'
2 'b' 3 '2019-02-11 15:01:52'

现在粘贴变得更简单-我们需要折叠每行,并用括号将其包围,然后折叠结果字符串。在单行中,是(如上修复dat之后):

> paste0(
    apply(
        as.data.frame(
            lapply(dat,function(x) { if (is.character(x)) paste0("'",x,"'") else x })),
        1,function(x){paste0('(',paste0(x,collapse=','),')')})
    ,collapse=',')   
 [1] "('a',2,'2019-02-11 15:01:52'),('b',3,'2019-02-11 15:01:52')"

排长队,所以我把它弄碎了。

答案 1 :(得分:1)

对于这些用例,glue软件包非常有用:

Stat

此外,如果只需要新的def set_query @query = params[:query] end def set_documents @documents = @folder ? @folder.documents : current_user.documents @documents = (params[:query] ? @documents.where( :$text => {:$search => { name: (/.*(#{@query})+.*/i)}.to_s} ) : @documents).page(params[:page]) end 列,则可以将library(tidyverse) library(glue) dat <- data.frame(id = letters[1:2], x = 2:3, date = lubridate::now()) dat %>% mutate( description = glue("('{id}', {x}, '{date}')") ) #> id x date description #> 1 a 2 2019-02-11 09:53:29 ('a', 2, '2019-02-11 09:53:29') #> 2 b 3 2019-02-11 09:53:29 ('b', 3, '2019-02-11 09:53:29') 添加到管道中以获取:

description

然后甚至可能是%>% pull(description),具体取决于您打算对输出执行什么操作:

(above code) %>% pull(description)

('a', 2, '2019-02-11 09:52:14')
('b', 3, '2019-02-11 09:52:14')