【问题标题】:How do you separate a column where values are separated by commas r如何分隔值以逗号分隔的列 r
【发布时间】:2018-07-18 23:14:03
【问题描述】:

我正在使用 R,我在四列中有一组天气读数,用逗号分隔,如下所示:

  pollutant air_quality_idx    air_quality_cat air_quality_cat_idx
  PM2.5,PM10,OZONE         28,6,24     Good,Good,Good               1,1,1
  PM2.5,PM10,OZONE         28,5,25     Good,Good,Good               1,1,1
  OZONE,PM2.5,PM10         26,23,4     Good,Good,Good               1,1,1
  OZONE,PM2.5,PM10         26,23,3     Good,Good,Good               1,1,1
  OZONE,PM2.5,PM10         27,22,3     Good,Good,Good               1,1,1
  OZONE,PM2.5,PM10         27,24,2     Good,Good,Good               1,1,1
  PM2.5,PM10,OZONE         50,4,27     Good,Good,Good               1,1,1
  PM2.5,PM10,OZONE         54,4,22 Moderate,Good,Good               2,1,1
  PM2.5,PM10,OZONE         56,5,22 Moderate,Good,Good               2,1,1
  PM2.5,PM10,OZONE         60,5,28 Moderate,Good,Good               2,1,1

三个读数(臭氧、10 微米、2.5 微米)的顺序随机变化。我想将 4 列用逗号分隔的 3 个值分成 12 列并将它们组合在一起,这样四列中的第一个值将放在一起,第二个值放在一起,第三个值放在一起用于每一行。有没有人有任何想法?谢谢!

【问题讨论】:

  • 您正在使用或想要使用哪种编程语言/环境?
  • 对不起,我正在使用 R
  • 抱歉,我不是 R 开发人员。我已将 r 标签添加到问题中。

标签: r air data-conversion weather


【解决方案1】:

我的“splitstackshape”包非常适合这种转换:

library(splitstackshape)
cSplit(mydf, names(mydf), direction = "long")
#     pollutant air_quality_idx air_quality_cat air_quality_cat_idx
#  1:     PM2.5              28            Good                   1
#  2:      PM10               6            Good                   1
#  3:     OZONE              24            Good                   1
#  4:     PM2.5              28            Good                   1
#  5:      PM10               5            Good                   1
# ---                                                              
# 26:      PM10               5            Good                   1
# 27:     OZONE              22            Good                   1
# 28:     PM2.5              60        Moderate                   2
# 29:      PM10               5            Good                   1
# 30:     OZONE              28            Good                   1

在base R中,你也可以这样做:

data.frame(lapply(mydf, function(x) 
  type.convert(unlist(strsplit(as.character(x), ",", TRUE)))))

或者,使用“tidyverse”,您可以尝试:

library(tidyverse)
mydf %>%
  mutate_all(funs(strsplit(as.character(.), ","))) %>%
  unnest()

【讨论】:

    【解决方案2】:

    这是一种解决方案,虽然可能不是最优雅的。它依赖于使用tidyr::separate 将每列拆分为三列,然后使用dplyr::select 简单地将那个 12 列的表拆分为三个 4 列的表,给它们相同的列名,然后将它们堆叠在一起bind_rows.

    library(tidyverse)
    tbl <- read_table2(
      "pollutant air_quality_idx    air_quality_cat air_quality_cat_idx
      PM2.5,PM10,OZONE         28,6,24     Good,Good,Good               1,1,1
      PM2.5,PM10,OZONE         28,5,25     Good,Good,Good               1,1,1
      OZONE,PM2.5,PM10         26,23,4     Good,Good,Good               1,1,1
      OZONE,PM2.5,PM10         26,23,3     Good,Good,Good               1,1,1
      OZONE,PM2.5,PM10         27,22,3     Good,Good,Good               1,1,1
      OZONE,PM2.5,PM10         27,24,2     Good,Good,Good               1,1,1
      PM2.5,PM10,OZONE         50,4,27     Good,Good,Good               1,1,1
      PM2.5,PM10,OZONE         54,4,22 Moderate,Good,Good               2,1,1
      PM2.5,PM10,OZONE         56,5,22 Moderate,Good,Good               2,1,1
      PM2.5,PM10,OZONE         60,5,28 Moderate,Good,Good               2,1,1",
      col_types = "cccc"
    )
    
    separated <- tbl %>%
      separate(pollutant, c("pol1", "pol2", "pol3"), sep = ",") %>%
      separate(air_quality_idx, c("aqi1", "aqi2", "aqi3"), sep = ",") %>%
      separate(air_quality_cat, c("aqc1", "aqc2", "aqc3"), sep = ",") %>%
      separate(air_quality_cat_idx, c("aci1", "aci2", "aci3"), sep = ",")
    
    output <- bind_rows(
      separated %>%
        select(ends_with("1")) %>%
        set_names(c("pol", "aqi", "aqc", "aci")),
      separated %>%
        select(ends_with("2")) %>% 
        set_names(c("pol", "aqi", "aqc", "aci")),
      separated %>%
        select(ends_with("3")) %>%
        set_names(c("pol", "aqi", "aqc", "aci"))
    )
    # A tibble: 30 x 4
       pollution aq_idx aq_cat   aq_cat_idx
       <chr>     <chr>  <chr>    <chr>     
     1 PM2.5     28     Good     1         
     2 PM2.5     28     Good     1         
     3 OZONE     26     Good     1         
     4 OZONE     26     Good     1         
     5 OZONE     27     Good     1         
     6 OZONE     27     Good     1         
     7 PM2.5     50     Good     1         
     8 PM2.5     54     Moderate 2         
     9 PM2.5     56     Moderate 2         
    10 PM2.5     60     Moderate 2         
    # ... with 20 more rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多