我有一个数据框,其中包含许多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
谢谢!
答案 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")