仅举一个简单的小例子,我该如何根据组号重命名列?
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)
}函数将重复值和NAs合并起来。
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 发布于 2019-04-02 15:47:31
似乎您希望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>https://stackoverflow.com/questions/55477979
复制相似问题