在连接日期格式时将data.frame扩展为long

时间:2016-10-13 11:35:31

标签: r matrix frame

在R(或其他语言)中,我想将较高的数据帧转换为较低的数据帧。 我怎样才能做到这一点? 先谢谢你。

year month income expense
2016 07 50 15
2016 08 30 75


month income_expense
1 2016-07             50
2 2016-07            -15
3 2016-08             30
4 2016-08            -75

2 个答案:

答案 0 :(得分:1)

好吧,您似乎正在尝试在同一个问题中执行多项操作:合并日期列,融合数据,某些字符串转换和排序

这将给出您的预期输出:

library(tidyr); library(reshape2); library(dplyr)
df %>% unite("date", c(year, month)) %>% 
  mutate(expense=-expense) %>% melt(value.name="income_expense") %>% 
  select(-variable) %>% arrange(date)
####      date income_expense
#### 1 2016_07             50
#### 2 2016_07            -15
#### 3 2016_08             30
#### 4 2016_08            -75

我在这里使用了三个不同的库,以便更好地阅读代码。但是,有可能用基数R来做。

答案 1 :(得分:1)

以下是仅使用两个软件包dplyrtidyr

的解决方案

首先,您的数据集:

df <- dplyr::data_frame(
  year =2016,
  month = c("07", "08"),
  income = c(50,30), 
  expense = c(15, 75)
)

mutate()中的dplyr函数会创建/编辑各个变量。 gather()中的tidyr函数会以您指定的方式将多个变量/列组合在一起。

df <- df %>% 
  dplyr::mutate(
    month = paste0(year, "-", month)
  ) %>% 
  tidyr::gather(
    key = direction, #your name for the new column containing classification 'key' 
    value = income_expense, #your name for the new column containing values
    income:expense #which columns you're acting on
  ) %>% 
  dplyr::mutate(income_expense =  
    ifelse(direction=='expense', -income_expense, income_expense)  
  )

输出包含您需要的所有信息(但我们会在最后一步中清理它)

   > df
# A tibble: 4 × 4
   year   month direction income_expense
  <dbl>   <chr>     <chr>          <dbl>
1  2016 2016-07    income             50
2  2016 2016-08    income             30
3  2016 2016-07   expense            -15
4  2016 2016-08   expense            -75

最后,我们select()删除我们不想要的列,然后对其进行排列,以便df以与您在问题中描述的顺序相同的顺序显示行。

df <- df %>% 
  dplyr::select(-year, -direction) %>% 
  dplyr::arrange(month)
> df
# A tibble: 4 × 2
    month income_expense
    <chr>          <dbl>
1 2016-07             50
2 2016-07            -15
3 2016-08             30
4 2016-08            -75

注意:我猜我正在使用三个库,包括管道运算符magrittr的{​​{1}}。但是,由于管道操作员是最好的事情,我经常忘记计算%>%