在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
答案 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)
以下是仅使用两个软件包dplyr
和tidyr
首先,您的数据集:
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}}。但是,由于管道操作员是最好的事情,我经常忘记计算%>%
。