Как функционально распространять и объединять данные - PullRequest
3 голосов
/ 02 апреля 2019

Простой простой пример, как мне переименовать столбец, основанный на номере группы?

dat_func <- function(i){

dat %>% filter(group_no == i) %>% mutate(WHERE[i] = WHERE) %>% select(-WHERE)

}

lapply(1:max(dat$group_no), function(i) dat_func(i))

Взяв пример ввода, такой как:

> data.frame(uniqueID= c(123,234,345,345,456),group_no=c(1,1,1,2,1), WHERE=rep("test",5))
  uniqueID group_no WHERE
1      123        1  test
2      234        1  test
3      345        1  test
4      345        2  test
5      456        1  test

И создавая это:

> data.frame(uniqueID=c(123,234,345,456),WHERE1=rep("test",4), WHERE2=c(NA,NA,"test",NA))
  uniqueID WHERE1 WHERE2
1      123  test   <NA>
2      234  test   <NA>
3      345  test   test
4      456  test   <NA>

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ:

Моя первоначальная проблема была немного более сложной, но вот решение, которое я нашел:

library(tidyverse)
library(dplyr)
library(magrittr)

Имел некоторыеповторяющиеся данные, которые необходимо объединить с повторяющимся назначением группы.

dat <- data.frame(uniqueID= c(123,234,345,456,456),
           TEST1=c(1,1,1,NA,1),
           TEST2=c(1,1,1,1,NA),
           WHERE=rep("test",5))

Создайте значение повторяющейся группы.

dat %<>% mutate(DUPE = as.numeric(duplicated(uniqueID))+1)

Функция для создания повторяющихся групповых переменных:

rep_group <- function(i) {

  dat %>%
    mutate(DUPE = paste0(i, DUPE)) %>%
    spread(key = DUPE, value = i)

}

Функция для объединения повторяющихся значений и NA.

coalesce_by_column <- function(df) {
  return(dplyr::coalesce(!!! as.list(df)))
}

Список повторяющихся групповых переменных

rep_list <- c("WHERE")

Применение функции повторяющейся группы и объединение всего:

lapply(rep_list, function(i) rep_group(i)) %>% 
  as.data.frame() %>% 
  select(-matches("[.]")) %>% 
  group_by(uniqueID) %>% 
  summarise_all(coalesce_by_column)

Подводя итог:

Эти шаги принимают данные, которые выглядят следующим образом:

  uniqueID TEST1 TEST2 WHERE 
1      123     1     1  test    
2      234     1     1  test    
3      345     1     1  test    
4      456    NA     1  test    
5      456     1    NA  test    

И генерирует такие данные:

  uniqueID TEST1 TEST2 WHERE1 WHERE2
     <dbl> <dbl> <dbl> <fct>  <fct> 
1      123     1     1 test   NA    
2      234     1     1 test   NA    
3      345     1     1 test   NA    
4      456     1     1 test   test 

1 Ответ

3 голосов
/ 02 апреля 2019

Похоже, вы хотите group_no перейти от длинного к широкому формату. Есть несколько способов сделать это в R. Вот решение, использующее tidyverse (более конкретно, tidyr::spread).

library(tidyverse)

df1 <- data.frame(uniqueID= c(123,234,345,345,456),group_no=c(1,1,1,2,1), WHERE=rep("test",5))

# Long to wide
df1 <- df1 %>%
  spread(key = group_no, value = WHERE)

# Renaming columns
names(df1)[-1] <- paste0("WHERE", names(df1)[-1])
df1

  uniqueID WHERE1 WHERE2
1      123   test   <NA>
2      234   test   <NA>
3      345   test   test
4      456   test   <NA>

Или вы добавляете «имя столбца» к group_no заранее с помощью чего-то вроде этого:

df1 %>%
  mutate(group_no = paste0("WHERE", group_no)) %>%
  spread(key = group_no, value = WHERE)

  uniqueID WHERE1 WHERE2
1      123   test   <NA>
2      234   test   <NA>
3      345   test   test
4      456   test   <NA>
...