我想整理数据

I want to make tidy data

我想根据重复数据制作传播数据。我想根据重叠的行来累积列。比如X2列重复5次。

它看起来类似于使用 tidyr 包中的 spread 函数,但还是有一点不同。你能给我一些想法吗?

输入:

  X1       X2       X3       
1 A         1       10                        
2 B         2       11              
3 C         3       13             
4 A         4       12            
5 F         5       16    
6 D         1       17
            .
            .
            .
515 E       5       18

输出:

  X2     X1.1   X3.1   X1.2   X3.2     ... 102 steps
1  1     A      10     D      17
2  2     B      11
3  3     C      13
4  4     A      12 
5  5     F      16

使用 dplyrtidyr 我们可以按 X2 分组并构建我们将 unnest 成所需格式的小标题。

我稍微修改了您的数据以获得完整示例:

library(tidyverse)
df1 %>% 
  group_by(X2) %>%
  summarize_all(~as.list(.) %>%
                  setNames(seq_along(.)) %>%
                  as_tibble %>% 
                  list) %>%
  unnest(.sep = ".")

# # A tibble: 3 x 5
#      X2  X1.1  X1.2  X3.1  X3.2
#   <int> <chr> <chr> <int> <int>
# 1     1     A     A    10    12
# 2     2     B     F    11    16
# 3     3     C     D    13    17

还有一个合法整洁的方式:

df1 %>%
  mutate(i = cumsum(X2 == 1)) %>%
  gather(key, value, X1,X3) %>%
  unite(key,key,i, sep=".") %>%
  spread(key, value)

#   X2 X1.1 X1.2 X3.1 X3.2
# 1  1    A    A   10   12
# 2  2    B    F   11   16
# 3  3    C    D   13   17

数据

df1 <- read.table(header=TRUE,stringsAsFactors=FALSE,text="X1       X2       X3       
1 A         1       10                        
2 B         2       11              
3 C         3       13             
4 A         1       12            
5 F         2       16    
6 D         3       17")