我有一个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)"
答案 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')