我想保留一些联接后的数据框属性。似乎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变量来存储它们。
答案 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") )
但是您可能知道,如果第一个参数是正在处理的对象,则可以将其删除。这样,您可以在执行破坏性分配(<-
)之前重新连接。因此,您需要将连接之前的属性另存为一个单独的值,然后在连接之后的一个单独步骤中重新附加它,或者以这种方式(在破坏性的“后退”分配之前重新分配。)