我有一个数据框,其中包含行标识的名称和日期作为列标识。
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
展平到该结构中?
答案 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"))