2016-04-23 63 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 
相關問題