如何变换/展平R数据帧

时间:2017-10-16 21:14:11

标签: r dataframe

我有一个数据框,其中包含行标识的名称和日期作为列标识。

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展平到该结构中?

3 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:0)

最简单的方法是使用类似下面的内容。需要注意的是,将数字作为列名称通常不是一种好习惯。这将导致与其他功能的兼容性问题。

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)

答案 2 :(得分:0)

简单的单行内容是转置df然后转换melt(来自reshape2

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