【发布时间】:2019-08-23 23:15:01
【问题描述】:
只是一个简单的小例子,我该如何根据组号重命名列?
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
【问题讨论】:
-
添加了一些示例代码,但可能需要多玩一些才能问得更清楚。
-
您可能需要删除
filter中的[]并使用mutate(paste0(WHERE, i) := -
在
filter步骤之后,为什么'WHERE2'中的某些元素是NA。不清楚这里的情况 -
抱歉不清楚,有点复杂的数据步骤。我按重复值分组并将组内的唯一值重新分配给重复组变量。所以 group_no == 1 是第一个组,需要分配给重复组变量 WHERE1,group_no == 2 需要分配给 WHERE2 但 group_no == 2 将绑定到重复组值。
-
简而言之,group_no == 2 是其前面的 group_no == 1 的重复组值。 mutate(group_no = as.numeric(duplicated(uniqueID))+1)