【问题标题】:Reorganizing Data in a data table重新组织数据表中的数据
【发布时间】:2020-12-09 22:00:16
【问题描述】:

当我为网络数据库拉取数据时,我的数据采用这种格式。

site date time parameter_code remark_code result
001 01-01-2020 15:10 00010 NA 16.6
001 01-01-2020 15:10 00095 NA 521.0
001 01-01-2020 15:10 00300 NA 5.6
001 01-01-2020 15:10 34475 < 1.0
001 03-30-2020 09:45 00010 NA 18.0
001 03-30-2020 09:45 00095 NA 546.0
001 03-30-2020 09:45 00300 NA 3.7
001 03-30-2020 09:45 34475 NA 2.3

我想将其格式化如下所示。 我知道我需要先将 Remark_code 和 Result 的列组合起来,但我不确定如何将 Parameter_code 列解析为单独的列,并将 Result 填充到表格的“正文”中。

site date time 00010 00095 00300 34475
001 01-01-2020 15:10 16.6 521.0 5.6 <1.0
001 03-30-2020 15:10 18.0 546.0 3.7 2.3

我不一定需要有关如何执行此操作的所有代码,而只需要有关使用哪些功能的说明。我一直在为此苦苦挣扎,因为我什至不确定要查找哪些关键词或这种类型的转换(?)这将被称为。任何帮助将不胜感激。

【问题讨论】:

  • 您正在寻求“从长到宽重塑”。 Base R 具有reshape 功能。另一个流行的选项是tidyr::pivot_wider。请注意,“宽”格式在 excel 表中很流行,而大多数 R 用户更喜欢“长”格式的数据集(就像您已经拥有的一样)。 Hadley 在Tidy Data 上的论文解释了原因。

标签: r dataframe data-manipulation data-management


【解决方案1】:

另一种方法可以是:

library(dplyr)
library(tidyr)
#Code
new <- df %>% mutate(RESULT=ifelse(is.na(REMARK_CODE),paste0('',RESULT),
                            paste0(REMARK_CODE,RESULT))) %>%
  select(-REMARK_CODE) %>%
  pivot_wider(names_from = PARAMETER_CODE,values_from=RESULT)

输出:

# A tibble: 2 x 7
  SITE  DATE      TIME  `10`  `95`  `300` `34475`
  <chr> <chr>     <chr> <chr> <chr> <chr> <chr>  
1 001   1/1/2020  15:10 16.6  521   5.6   <1     
2 001   3/30/2020 9:45  18    546   3.7   2.3    

使用的一些数据:

#Data
df <- structure(list(SITE = c("001", "001", "001", "001", "001", "001", 
"001", "001"), DATE = c("1/1/2020", "1/1/2020", "1/1/2020", "1/1/2020", 
"3/30/2020", "3/30/2020", "3/30/2020", "3/30/2020"), TIME = c("15:10", 
"15:10", "15:10", "15:10", "9:45", "9:45", "9:45", "9:45"), PARAMETER_CODE = c(10L, 
95L, 300L, 34475L, 10L, 95L, 300L, 34475L), REMARK_CODE = c(NA, 
NA, NA, "<", NA, NA, NA, NA), RESULT = c(16.6, 521, 5.6, 1, 18, 
546, 3.7, 2.3)), row.names = c(NA, -8L), class = "data.frame")

【讨论】:

    【解决方案2】:

    我们可以在unite'REMARK_CODE'和'RESULT'列之后使用pivot_wider

    library(dplyr)
    library(tidyr)
    df1 %>%
      unite(RESULT, REMARK_CODE, RESULT, sep="", na.rm = TRUE) %>%
       pivot_wider(names_from = PARAMETER_CODE, values_from = RESULT)
    

    -输出

    # A tibble: 2 x 7
    #   SITE  DATE      TIME  `10`  `95`  `300` `34475`   
    #   <chr> <chr>     <chr> <chr> <chr> <chr> <chr>  
    # 1 001   1/1/2020  15:10 16.6  521   5.6   <1     
    #   2 001   3/30/2020 9:45  18    546   3.7   2.3    
    

    数据

    df1 <- structure(list(SITE = c("001", "001", "001", "001", "001", "001", 
    "001", "001"), DATE = c("1/1/2020", "1/1/2020", "1/1/2020", "1/1/2020", 
    "3/30/2020", "3/30/2020", "3/30/2020", "3/30/2020"), TIME = c("15:10", 
    "15:10", "15:10", "15:10", "9:45", "9:45", "9:45", "9:45"), PARAMETER_CODE = c(10L, 
    95L, 300L, 34475L, 10L, 95L, 300L, 34475L), REMARK_CODE = c(NA, 
    NA, NA, "<", NA, NA, NA, NA), RESULT = c(16.6, 521, 5.6, 1, 18, 
    546, 3.7, 2.3)), row.names = c(NA, -8L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 2022-01-02
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多