我要整理数据

时间:2019-02-19 09:57:13

标签: r accumulate spread wrangle

我想基于重复数据制作传播数据。我想基于重叠的行来累积列。例如,X2列重复5次。

它看起来与在tidyr程序包中使用传播功能相似,但有所不同。你能给我个主意吗?

输入:

  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

1 个答案:

答案 0 :(得分:1)

使用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")