Связывает информационный кадр в строках при дублировании идентификатора - PullRequest
0 голосов
/ 02 марта 2020

У меня есть кадр данных в R с дублированным идентификатором, который я хочу выровнять в одной и той же строке.

df <- data_frame(id = c("A1", "A2", "C2", "A2", "C2", "A2"),
             date = c("2010-01-15", "2016-03-05", "2017-05-21", "2013-09-03", "2015-11-25", "2011-07-07"),
             iT = c("z", "z", "v", "w", "z", "v"))

Я хотел бы выровнять каждый идентификатор в той же строке с a для l oop, но могу подмножество только одной переменной за раз (когда у меня на самом деле их около 10.) ш sh:

df3 <- data_frame(id = c("A1", "A2", "C2"),
  date1 = c("2010-01-15", "2016-03-05", "2017-05-21"),
  iT = c("z", "z", "v"),
  date2 = c("NA", "2013-09-03","2015-11-25"),
  iT.2 = c("NA", "w", "z"),
  date3 = c("NA", "2011-07-07", "NA"),
  iT.3 = c("NA", "v", "NA"))

Ответы [ 4 ]

0 голосов
/ 02 марта 2020

Рассмотрим базу R с transform, ave, seq_along, reshape, grep, merge, paste0 и outer:

# CREATE A RUNNING GROUP NUMBER FOR RESHAPING
df$id_num <- with(transform(df, n=1), ave(n, id, FUN=seq_along))

# MERGE TWO WIDE FORMAT SETS FOR date and iT
df <- merge(reshape(df[c("id", "id_num", names(df)[grep("date", names(df))])], 
                    v.names = "date", timevar = "id_num", direction = "wide"),
            reshape(df[c("id", "id_num", names(df)[grep("iT", names(df))])], 
                    v.names = "iT", timevar = "id_num", direction = "wide"),
            by = "id", suffices = c("", "_"))

# RE-ORDER COLUMNS BY PAIR COMBINATIONS
df <- df[c("id", outer(c("date.", "iT."), c(1:3), paste0))]
df
#   id     date.1 iT.1     date.2 iT.2     date.3 iT.3
# 1 A1 2010-01-15    z       <NA> <NA>       <NA> <NA>
# 2 A2 2016-03-05    z 2013-09-03    w 2011-07-07    v
# 3 C2 2017-05-21    v 2015-11-25    z       <NA> <NA>

Демоверсия

0 голосов
/ 02 марта 2020

Используя dplyr и tidyr, вы можете получить данные в длинном формате, создать уникальный идентификатор для каждой комбинации id и имени столбца и вернуть данные в широкоформатный формат.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -id) %>%
  group_by(id, name) %>%
  mutate(name1 = paste0(name, row_number())) %>%
  ungroup() %>%
  select(-name) %>%
  pivot_wider(names_from = name1, values_from = value)

#  id    date1      iT1   date2      iT2   date3      iT3  
#  <chr> <chr>      <chr> <chr>      <chr> <chr>      <chr>
#1 A1    2010-01-15 z     NA         NA    NA         NA   
#2 A2    2016-03-05 z     2013-09-03 w     2011-07-07 v    
#3 C2    2017-05-21 v     2015-11-25 z     NA         NA   
0 голосов
/ 02 марта 2020

dcast() может изменить несколько столбцов значений одновременно:

library(data.table)
dcast(setDT(df), id ~ rowid(id), value.var = c("date", "iT"))
   id     date_1     date_2     date_3 iT_1 iT_2 iT_3
1: A1 2010-01-15       <NA>       <NA>    z <NA> <NA>
2: A2 2016-03-05 2013-09-03 2011-07-07    z    w    v
3: C2 2017-05-21 2015-11-25       <NA>    v    z <NA>
0 голосов
/ 02 марта 2020

«Выровнять по одной строке» = изменить форму. ;)

База R (изменение формы)

df <- as.data.frame(df)[order(df$id),] # Convert to data frame and order by id
df$time <- ave(df$id, df$id, FUN=seq_along) # Add "time" variable.

stats::reshape(df, direction="wide", v.names=c("date","iT")) # just one line.

  id     date.1 iT.1     date.2 iT.2     date.3 iT.3
1 A1 2010-01-15    z       <NA> <NA>       <NA> <NA>
2 A2 2016-03-05    z 2013-09-03    w 2011-07-07    v
3 C2 2017-05-21    v 2015-11-25    z       <NA> <NA>
...