R加入后保留数据框属性

时间:2018-07-18 18:45:23

标签: r dplyr

我想保留一些联接后的数据框属性。似乎dplyr函数拥有列中的属性,而不是数据框本身中的属性。

请参见以下示例:

library("dplyr")
library("lubridate")


#Fake data
n = 20
df <- data.frame("user_id" = 1:n,
                 "type" = sample(c(1,2), n, replace = T),
                 "amount" = 1000*rnorm(n))

#Suppose I want to add some metadata
attr(df, "query_timestamp") <- lubridate::now()
attr(df$amount, "currency") <- "BRL"

#encoding table for user type
encode <- data.frame("type" = c(1,2), 
                     "description" = c("vendor", "shopper"))

print(attr(df, "query_timestamp"))
  

[1]“ 2018-07-18 15:30:57 -03”

print(attr(df$amount, "currency"))
  

[1]“ BRL”

df <- df %>% dplyr::left_join(encode, by = "type")
print(attr(df, "query_timestamp"))
  

NULL

print(attr(df$amount, "currency"))
  

[1]“ BRL”

有什么理由吗?我想保留属性,但避免使用aux变量来存储它们。

1 个答案:

答案 0 :(得分:1)

您可以使用attr<-函数“重新附加”属性:

df <- df %>% dplyr::left_join(encode, by = "type") %>% 
                         `attr<-`("query_timestamp", attr(df,"query_timestamp") )

> print(attr(df, "query_timestamp"))
[1] "2018-07-18 14:41:39 PDT"

通常,通话将是以下其中一项:

`attr(df, "query_timestamp") <-  attr(df,"query_timestamp") )
# or equivalently
`attr<-`(df, "query_timestamp", attr(df,"query_timestamp") )

但是您可能知道,如果第一个参数是正在处理的对象,则可以将其删除。这样,您可以在执行破坏性分配(<-)之前重新连接。因此,您需要将连接之前的属性另存为一个单独的值,然后在连接之后的一个单独步骤中重新附加它,或者以这种方式(在破坏性的“后退”分配之前重新分配。)