3

我有一个 R 数据框,其中包含所有类型的混合数据类型,例如因子、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)"

4

2 回答 2

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"

现在 out 数据框具有正确的类型,让我们在粘贴到已经引用的内容之前进行准备:

> 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')"

很长的一条线,所以我把它分开了一点。

于 2019-02-11T13:06:38.233 回答
1

glue软件包非常适合这些用例:

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')

然后甚至可能paste(collapse = ",")取决于您打算如何处理输出:

(above code) %>% pull(description) %>% paste(collapse = ",")

[1] "('a', 2, '2019-02-11 09:52:14'),('b', 3, '2019-02-11 09:52:14')"
于 2019-02-11T14:53:52.063 回答