【问题标题】:is there an R code for the following data wrangling and transformation是否有用于以下数据整理和转换的 R 代码
【发布时间】:2020-11-22 07:33:25
【问题描述】:

我有以下数据集

id<-c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
s02<-c(001,002,003,004,001,002,003,004,005,001,002,003,004,005,006,007,001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,016,017,018,019,020,021,022,023,024,025,026,027,028,029)
dat1<-data.frame(id,s02)

我希望根据这个 dat1 创建一个数据集。我希望有一个 R 代码自动创建 n s02 作为 s02__0、s02__1、s02__2、s02__3、s02__4,在这种情况下我的 n==5。然后根据 dat1 中的 ID,代码应该将每个 s02 分配给数据帧中各自的 s02__0 到 s02__4。这些行由基于行数创建的另一个 ID_2 唯一标识。如果创建的行中的 s02 较少,则应分配剩余的单元格##N/A##。如果 s02 大于 n,则将形成另一个具有唯一 ID_2 增量的新行以容纳额外的 s02,并且每个空白单元格仍填充有 ##N/A##。 从上面的数据集中,我希望得到以下输出

id<-c(1,2,3,3,4,4,4,4,4,4)
id_2<-c(1,1,1,2,1,2,3,4,5,6)
s02__0<-c(1,1,1,6,1,6,11,16,21,26)
s02__1<-c(2,2,2,7,2,7,12,17,22,27)
s02__2<-c(3,3,3,##N/A##,3,8,13,18,23,28)
s02__3<-c(4,4,4,##N/A##,4,9,14,19,24,29)
s02__4<-c(##N/A##,5,5,##N/A##,5,10,15,20,25,##N/A##)

dat2<-data.frame(id,id_2,s02__0,s02__1,s02__2,s02__3,s02__4)

【问题讨论】:

    标签: r dplyr long-integer widechar


    【解决方案1】:

    这可以产生你想要的:

    library(tidyverse)
    #Data
    id<-c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3)
    s02<-c(001,002,003,004,001,002,003,004,005,001,002,003,004,005,006,007)
    dat1<-data.frame(id,s02)
    #Code
    dat2 <- dat1 %>% group_by(id) %>% mutate(id2 = ifelse(s02<=5,1,2)) %>% ungroup() %>%
      group_by(id,id2) %>% mutate(val=1:n()-1,nid = cur_group_id()) %>% ungroup() %>%
      select(-id2) %>% mutate(id=paste0(id,'.',nid),val=paste0('s02','.',val)) %>% select(-nid) %>%
      pivot_wider(names_from = c(val),values_from = s02) %>%
      mutate(id=gsub("\\..*","", id)) %>% group_by(id) %>%
      mutate(id2=1:n()) %>% select(order(colnames(.)))
    dat2
    
    # A tibble: 4 x 7
    # Groups:   id [3]
      id      id2 s02.0 s02.1 s02.2 s02.3 s02.4
      <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 1         1     1     2     3     4    NA
    2 2         1     1     2     3     4     5
    3 3         1     1     2     3     4     5
    4 3         2     6     7    NA    NA    NA
    

    【讨论】:

    • 我永远感激这个结果,因为这正是我想要的。但是,当我尝试代码时,它返回以下错误“cur_group_id() 中的错误:找不到函数“cur_group_id””。我试图将我的 dplyr 和 tidyverse 更新到最新版本,但错误仍然存​​在。请协助,并提前感谢您
    • @SamMwenda 这是一个包问题。我有dplyr_1.0.0 并且该功能存在。尝试获取该版本或从 CRAN 下载并手动安装。如果你解决了这个问题,请告诉我:)
    • @SamMwenda 另外,安装完后重新启动R
    • 亲爱的@Duck,评论很有帮助。我已经编辑了数据框,因为我正在使用一个大型数据框,并且从您上面的代码中,“ifelse(s02
    猜你喜欢
    • 2018-04-08
    • 2019-09-07
    • 2022-01-15
    • 2020-09-02
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多