【问题标题】:How to functionally spread and coalesce data如何在功能上传播和合并数据
【发布时间】: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)

标签: r dplyr lapply


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2018-04-11
  • 2017-10-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多