gpt4 book ai didi

r - 如何在功能上传播和合并数据

转载 作者:行者123 更新时间:2023-12-01 13:15:32 25 4
gpt4 key购买 nike

只是一个简单的小例子,我如何根据组号重命名列?

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

最佳答案

您似乎希望 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>

关于r - 如何在功能上传播和合并数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55477979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com