Я хочу сделать аккуратные данные - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу сделать данные распространения на основе дубликатов данных.Я хочу накапливать столбцы на основе перекрывающихся строк.Например, столбец 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 голосов
/ 19 февраля 2019

С помощью dplyr и tidyr мы можем сгруппировать по 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")
...