Простой простой пример, как мне переименовать столбец, основанный на номере группы?
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