繁体   English   中英

如何重塑具有多个级别的数据框

[英]How to reshape dataframe with multiple levels

我目前有一个格式如下所示的数据框(df1):

ID A1 A1.1 A1.2 A1.3 B1 B1.1 B1.2 B1.3 C1 C1.1 C1.2 C1.3
1 10 1 1 0 15 0 1 0 30 1 0 0
2 25 1 0 0 30 0 1 1 25 1 0 1
3 40 0 1 0 15 0 1 0 10 0 0 1
4 25 1 1 0 10 0 1 1 30 1 0 0

我想重新格式化它,使其按照 df2 中所示的方式排列:

ID A1_C1_value R1 R2 R3 A_C
1 10 1 1 0 一种
1 15 0 1 0
1 30 1 0 0 C
2 25 1 0 0 一种
2 30 0 1 1
2 25 1 0 1 C
3 40 0 1 0 一种
3 15 0 1 0
3 10 0 0 1 C
4 25 1 1 0 一种
4 10 0 1 1
4 30 1 0 0 C

我已经能够旋转更长的时间来获得 A1_C1 值和 A_C 列,但是剩下的是 A1.2-1.3、B1.2-1.3、C1.2-1.3。 我如何将这些包含在我的转换中? 这是我到目前为止所做的:

df2 <- pivot_longer(df1, cols = c("A1","B1","C1"), names_to ="A_C",
 values_to = "A1_C1_value")

您可以使用pivot_longer()但如果您首先按如下方式重命名变量会更容易:

x <- data.frame(
  ID = 1:4, 
  A1 = c(10,25,40,25), 
  A1.1=c(1,1,0,1), 
  A1.2=c(1,0,1,1), 
  A1.3=c(0,0,0,0), 
  B1 = c(15,30,15,10), 
  B1.1=c(0,0,0,0), 
  B1.2=c(1,1,1,1), 
  B1.3=c(0,1,0,1), 
  C1 = c(30,25,10,30), 
  C1.1=c(1,1,0,1), 
  C1.2=c(0,0,0,0), 
  C1.3=c(0,1,1,0)
)

x %>% 
  rename("A1.0" = "A1", 
         "B1.0" = "B1", 
         "C1.0" = "C1") %>% 
  pivot_longer(`A1.0`:`C1.3`, 
               names_pattern=c("([A-C])\\d.(\\d)"), 
               names_to=c("A_C", ".value"), 
               names_prefix = "R") %>%
  rename("A1_C1_value" = "0", 
         "R1" = "1", 
         "R2" = "2", 
         "R3" = "3")

# # A tibble: 12 × 6
#      ID A_C   A1_C1_value    R1    R2    R3
#   <int> <chr>       <dbl> <dbl> <dbl> <dbl>
# 1     1 A              10     1     1     0
# 2     1 B              15     0     1     0
# 3     1 C              30     1     0     0
# 4     2 A              25     1     0     0
# 5     2 B              30     0     1     1
# 6     2 C              25     1     0     1
# 7     3 A              40     0     1     0
# 8     3 B              15     0     1     0
# 9     3 C              10     0     0     1
# 10     4 A              25     1     1     0
# 11     4 B              10     0     1     1
# 12     4 C              30     1     0     0**

您可以使用data.table非常有效地执行此data.table

library(data.table)
df1 <- data.table(df1)
df2 <- melt(df1, measure = patterns("[A-Z]1$", "1.1$", "1.2$", "1.3$"),
           value.name = c("A1_C1_value", "R1", "R2", "R3"), variable.name = "A_C")
df2[, A_C := LETTERS[A_C]][order(ID)]

生产:

    ID A_C A1_C1_value R1 R2 R3
 1:  1   A          10  1  1  0
 2:  1   B          15  0  1  0
 3:  1   C          30  1  0  0
 4:  2   A          25  1  0  0
 5:  2   B          30  0  1  1
 6:  2   C          25  1  0  1
 7:  3   A          40  0  1  0
 8:  3   B          15  0  1  0
 9:  3   C          10  0  0  1
10:  4   A          25  1  1  0
11:  4   B          10  0  1  1
12:  4   C          30  1  0  0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM