【问题标题】:Transposing parts of a data frame to individual columns将数据框的部分转置到各个列
【发布时间】:2017-07-04 20:28:55
【问题描述】:

我是 R 的新手,有点挣扎。我有一个这样的数据框

reg     12345
val1    1
val2    0
reg     45678
val1    0
val2    0
val3    1
reg     97654
val1    1
reg     567834
val3    1
reg     567845
val2    0
val4    1

我的目标是将这种格式的数据转换成

 reg     val1    val2    val3    val4
 12345   1       0       0       0
 45678   0       0       1       0
 97654   1       0       0       0
 567834  0       0       1       0
 567845  0       0       0       1

希望有人可以在这里指导我。我的数据源少于 200 行,并且对方法没有任何限制。请假设 机器运行有足够的内存和处理能力。

【问题讨论】:

标签: r


【解决方案1】:

即使这是重复的,我也没有看到下面的答案,所以……从原始数据开始:

df <- data.frame( A = c("reg","val1","val2","reg","val1","val2","val3","reg","val1","reg","val3","reg","val2","val4"),
                  B = c(12345, 1, 0, 45678, 0, 0, 1, 97654, 1, 567834, 1, 567845, 0, 1))

我使用tidyverse 动词,以及使用cumsum 为每个"reg" 组添加标签(在dummy 中)的技巧:

install.packages("tidyverse")
library(tidyverse)
df1 <- df %>% 
          mutate(dummy = cumsum(A=="reg")) %>%
          group_by(dummy) %>%
          nest() %>%
          mutate(data = map(data, ~spread(.x, A, B))) %>%
          unnest() %>%
          select(-dummy)

这会导致:

     reg  val1  val2  val3  val4
1  12345     1     0    NA    NA
2  45678     0     0     1    NA
3  97654     1    NA    NA    NA
4 567834    NA    NA     1    NA
5 567845    NA     0    NA     1

我更喜欢保留NAs,但如果你不这样做:

df1[is.na(df1)] <- 0

     reg  val1  val2  val3  val4
1  12345     1     0     0     0
2  45678     0     0     1     0
3  97654     1     0     0     0
4 567834     0     0     1     0
5 567845     0     0     0     1

【讨论】:

    【解决方案2】:

    这是一个使用dcast的选项

    library(data.table)
    dcast(setDT(df), cumsum(A=="reg") ~ A, value.var = "B", fill = 0)[, A := NULL][]
    #      reg val1 val2 val3 val4
    #1:  12345    1    0    0    0
    #2:  45678    0    0    1    0
    #3:  97654    1    0    0    0
    #4: 567834    0    0    1    0
    #5: 567845    0    0    0    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2021-10-31
      • 2022-08-03
      相关资源
      最近更新 更多