多行到多个列R中的数据帧

时间:2018-05-01 13:55:00

标签: r dataframe transpose

我是R的新手,我试图以某种方式将重复行的日期框架转换为列。我想要的是沿着tidyr的spread()线,但我相信它略有不同,因为我似乎无法做到正确。每条记录都是基于Company,Loc和Type的唯一记录,多个Spec行分散为列。每个唯一记录有不同数量的规格可以多达20个规格。

我有什么

Company    Loc         Type     Spec
100000012   104         51      363
100000012   104         51      431
100000012   104         51      508
100000012   104         51      512
100000012   104         51      513
100000012   126         51      513
100000012   166         53      530
100000012   42          51      516
100000012   43          53      530
100123545   50          52      513
100123545   50          52      363

我想要什么

Company    Loc         Type     Spec1  Spec2  Spec3  Spec4  Spec5
100000012   104         51      363     431    508    512    513
100000012   126         51      513
100000012   166         53      530
100000012   42          51      516
100000012   43          53      530
100123545   50          52      513     363

2 个答案:

答案 0 :(得分:1)

我们可以使用dcast

library(data.table)
dcast(setDT(df1), Company + Loc + Type ~
         paste0("Spec", rowid(Company, Loc, Type)), value.var = "Spec")

答案 1 :(得分:0)

我们还可以使用

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  group_by(Company, Loc) %>%
  mutate(ID = paste0("Spec", 1:n())) %>%
  ungroup() %>%
  spread(ID, Spec) %>%
  select(c("Company", "Loc", "Type", paste0("Spec", 1:(ncol(.) - 3))))
dat2
# # A tibble: 6 x 8
#     Company   Loc  Type Spec1 Spec2 Spec3 Spec4 Spec5
#       <int> <int> <int> <int> <int> <int> <int> <int>
# 1 100000012    42    51   516    NA    NA    NA    NA
# 2 100000012    43    53   530    NA    NA    NA    NA
# 3 100000012   104    51   363   431   508   512   513
# 4 100000012   126    51   513    NA    NA    NA    NA
# 5 100000012   166    53   530    NA    NA    NA    NA
# 6 100123545    50    52   513   363    NA    NA    NA  

数据

dat <- read.table(text = "Company    Loc         Type     Spec
100000012   104         51      363
                  100000012   104         51      431
                  100000012   104         51      508
                  100000012   104         51      512
                  100000012   104         51      513
                  100000012   126         51      513
                  100000012   166         53      530
                  100000012   42          51      516
                  100000012   43          53      530
                  100123545   50          52      513
                  100123545   50          52      363",
                  header = TRUE)