R中每月仅保留一个ID#

时间:2018-08-06 20:10:42

标签: r dataframe duplicates

我有一个数据框,其中包含许多ID号及其全年的交易数据。 ID之间有很多重复项,我想摆脱它们,但我想每月拥有一个ID。如果我使用[!duplicated ...]函数,它在一月份后也会删除所有ID。有什么想法吗?

这是我所拥有的:

Date        ID   Transaction
1/31/2016   111     10
1/31/2016   111     12
1/31/2016   112     15
2/28/2016   111     50
2/28/2016   112     40
2/28/2016   112     3

这就是我想要的:

Date        ID   Transaction1  Transaction 2
1/31/2016   111      10           12
1/31/2016   112      15            -
2/28/2016   111      50            -
2/28/2016   112      40            3    

谢谢!

3 个答案:

答案 0 :(得分:1)

我们可以使用spread

library(tidy verse)
df1 %>%
    group_by(Date, ID) %>%
    mutate(new = paste0("Transaction", row_number())) %>%
    spread(new, Transaction)
# A tibble: 4 x 4
# Groups:   Date, ID [4]
#  Date         ID Transaction1 Transaction2
#  <chr>     <int>        <int>        <int>
#1 1/31/2016   111           10           12
#2 1/31/2016   112           15           NA
#3 2/28/2016   111           50           NA
#4 2/28/2016   112           40            3

答案 1 :(得分:1)

虽然我知道spread 应该是实现此目的的方法,但我从未能够使它正常工作。我确定Hadley Wickham对此感到不满意,但是我要解决的问题是paste您想用Transaction散布到单个字符串中的summarize的所有值,然后使用separate

将该字符串分成几列

请注意,如您的示例所示,我们已按日期分组。如果您实际上想按月份分组,则需要使用lubridate从Date变量中提取月份值。

library(dplyr)
library(tidyr)

dates %>%
    group_by(ID, Date) %>%
    summarize(ntrans = length(Transaction),
              transactions = paste0(Transaction, collapse = '-')) %>%
    separate(transactions,
             into = paste0('Transaction', seq_len(max(.$ntrans))),
             sep = '-', fill = 'right') %>%
    select(-ntrans)


# A tibble: 4 x 4
# Groups:   ID [2]
     ID Date      Transaction1 Transaction2
  <int> <fct>     <chr>        <chr>       
1   111 1/31/2016 10           12          
2   111 2/28/2016 50           NA          
3   112 1/31/2016 15           NA          
4   112 2/28/2016 40           3 

答案 2 :(得分:0)

使用data.table软件包的另一种可能性:

data.table::dcast(dat[, Tx := paste0("Tx", rowid(ID)), by=.(Date)], 
    Date + ID ~ Tx, value.var="Transaction")

输出:

        Date  ID Tx1 Tx2
1: 1/31/2016 111  10  12
2: 1/31/2016 112  15  NA
3: 2/28/2016 111  50  NA
4: 2/28/2016 112  40   3

数据:

library(data.table)
dat <- fread("Date        ID   Transaction
1/31/2016   111     10
1/31/2016   111     12
1/31/2016   112     15
2/28/2016   111     50
2/28/2016   112     40
2/28/2016   112     3")