仅是一个简单的小例子,如何根据组号重命名一列?
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
答案 0 :(得分:3)
似乎您希望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>