将特定的重复列数据转换为具有ID#

时间:2018-07-27 13:07:05

标签: r dataframe rows transpose

我有一个数据框,该数据框由第一列中的ID#和该给定ID的多个事务组成。例如:

ID  Transaction
1111   $13
1111   $55
1111   $4
1112   $27
1112   $40
1113   $12
1114   $100
1114   $60
1114   $55

我想要做的是仅获得一行客户ID,然后为每个实例创建多个事务。例如:

ID  Transaction1  Transaction2  Transaction3
1111         $13           $55            $4
1112         $27           $40
1113         $12
1114        $100           $60           $55

任何帮助将不胜感激。我一直在尝试使用循环,而不是使用循环,但是我一直迷失在工作中,并一直在寻找一种更简单的方法来实现此目的。

3 个答案:

答案 0 :(得分:3)

使用data.table

library(data.table)
dcast(data, ID ~ paste0("Transaction", rowid(ID)), value.var = "Transaction")


     ID Transaction1 Transaction2 Transaction3
1: 1111          $13          $55           $4
2: 1112          $27          $40         <NA>
3: 1113          $12         <NA>         <NA>
4: 1114         $100          $60          $55

哪里

data <- fread("ID  Transaction
1111   $13
1111   $55
1111   $4
1112   $27
1112   $40
1113   $12
1114   $100
1114   $60
1114   $55")

答案 1 :(得分:3)

一种tidyverse方法

library(tidyverse)
df %>%
    group_by(ID) %>%
    mutate(n = paste0("Transaction", 1:n())) %>%
    spread(n, Transaction)
#    ID Transaction1 Transaction2 Transaction3
# <int> <fct>        <fct>        <fct>
#1  1111 $13          $55          $4
#2  1112 $27          $40          NA
#3  1113 $12          NA           NA
#4  1114 $100         $60          $55

样本数据

df <- read.table(text =
    "ID  Transaction
1111   $13
1111   $55
1111   $4
1112   $27
1112   $40
1113   $12
1114   $100
1114   $60
1114   $55", header = T)

答案 2 :(得分:0)

library(plyr)
library(reshape2)
x <- read.table(header = TRUE, text = "
           ID  Transaction
           1111   $13
           1111   $55
           1111   $4
           1112   $27
           1112   $40
           1113   $12
           1114   $100
           1114   $60
           1114   $55
           ")

x<- ddply(x, "ID", transform, 
      castTransaction = paste0("Transaction", seq(length(Transaction))))


dcast(ID ~ castTransaction, value.var = "Transaction", data = x)