2016-04-23 65 views
1

我有一个data.frame如下:转换(一个dplyr TBL-对象)的柱为TBL-头

 types  long_name 
    (chr)   (chr) 
1 neighborhood Upper East Side 
2 sublocality Manhattan 
3 postal_code 10021 

我想如下改造它:

 neighborhood sublocality postal_code 
    (chr)   (chr)   (chr) 
1 Upper East Side Manhattan  10021 

必须有做一个快速简便的方法。

编者按:这是显示的,而不是作为的R数据帧,但作为一个DPLY TBL-对象:

dput(as.tbl(dfrm)) 
structure(list(types = c("neighborhood", "sublocality", "postal_code" 
), long_name = c("Upper East Side", "Manhattan", "10021")), .Names = c("types", 
"long_name"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-3L)) 
+0

dplyr-'tbl'似乎是新的'data.table',因为noobs经常会将它们误认为是实际的R数据帧。我认为更有知识的用户需要在对象类意识方面保持一定的清晰度。 –

+0

@ 42-我的道歉,下次会更加小心 – Armin

回答

2

与Hadleyverse坚持,我们可以使用tidyr::spread从长变宽:

library(tidyr) 

df %>% spread(types, long_name) 
# Source: local data frame [1 x 3] 
# 
#  neighborhood postal_code sublocality 
#    (chr)  (chr)  (chr) 
# 1 Upper East Side  10021 Manhattan 
+1

哦,当然,向大家展示为什么不你;)@Armin - 我可能会检查这一个。这更符合你的工作。 –

+0

@RichardScriven ha谢谢你的帮助 – Armin

2

设置types如在long_name向量的名字,然后在其上运行as.data.frame.list()。假设df是你的数据帧...

as.data.frame.list(
    with(df, setNames(long_name, types)), 
    stringsAsFactors = FALSE 
) 
#  neighborhood sublocality postal_code 
# 1 Upper East Side Manhattan  10021 

或者,同样的东西稍微不同的方式...

as.data.frame(
    with(df, setNames(as.list(long_name), types)), 
    stringsAsFactors = FALSE 
) 

如果你需要一个数字邮政编码,该列运行as.numeric()。另外,由于您使用的是dplyr,因此您可以通过将其包含在tbl_df()中来获得您的确切需求结果。或者你可以用什么做的这一切在dplyr

df %>% 
    do(
     as.data.frame.list(
      setNames(.$long_name, .$types), 
      stringsAsFactors = FALSE 
     ) 
    ) %>% 
    tbl_df 
# Source: local data frame [1 x 3] 
# 
#  neighborhood sublocality postal_code 
#    (chr)  (chr)  (chr) 
# 1 Upper East Side Manhattan  10021 

数据:

df <- structure(list(types = c("neighborhood", "sublocality", "postal_code" 
), long_name = c("Upper East Side", "Manhattan", "10021")), .Names = c("types", 
"long_name"), row.names = c(NA, -3L), class = c("tbl_df", "tbl", 
"data.frame")) 
+0

我似乎是一个dplyr'tbl'。 –

+0

明白了@ 42- –

2

我们可以使用transpose

library(data.table) 
setNames(transpose(df[-1]), df$types) 
#  neighborhood sublocality postal_code 
#1 Upper East Side Manhattan  10021 
相关问题