2017-10-16 100 views
-2

我有一個數據框,其中的行標識和日期列名稱作爲列標識。如何轉換/拼合R數據幀

df <- data.frame(`20171007` = c(8, 4), 
       `20171014` = c(9, 7), 
       row.names = c("Kohl", "Travis")) 

我想要的是一個三列的數據結構,其中標識實際上是數據。

Date (get from column identity) 
Name (get from row identity) 
Value (get from df[r,c]) 

在這種特殊情況下,我最終會得到4行,每個值一個。我怎樣才能把我的df變成這種結構呢?

+2

如何寫一個可再現的例子。 https://stackoverflow.com/a/5965451/3651529 – Suren

回答

2

你可以做這樣的事情與tidyverse

library(tidyverse) 

df %>% 
    rownames_to_column(var = "Name") %>%  # tibble 
    gather(Date, Value, -Name) %>%   # tidyr 
    mutate(Date = as.Date(Date, "X%Y%m%d")) # dplyr 

結果:

Name  Date Value 
1 Kohl 2017-10-07  8 
2 Travis 2017-10-07  4 
3 Kohl 2017-10-14  9 
4 Travis 2017-10-14  7 

數據:

df = data.frame(`20171007` = c(8, 4), 
       `20171014` = c(9, 7), 
       row.names = c("Kohl", "Travis")) 
0

做最簡單的事情爲u類似於下面的東西。值得注意的是,將數字作爲列名通常不是一種好的做法。這將導致與其他功能的兼容性問題。

df = data.frame(`20171007` = c(8,4), 
      `20171014` = c(9, 7)) 
row.names(df) = c('Kohl', 'Travis') 

創建行的名稱列

df$names <- row.names(df) 

使用包tidyr重塑數據

編輯 - @user

df %>% 
    gather(date, value, -names) 
+0

這不會給你想要的結果,因爲你的名字也收集。你需要從我的答案 – useR

+0

中''聚集'('日期,價值,名稱)'聚集'''''''''''你就是。感謝您的信息。無論如何,我喜歡你更好(沒有gaff)。 – jacobsg

0

的簡單的一行是轉置df然後melt(從reshape2

melt(t(df), value.name = "Value", varnames = c("Date", "Name"))