【问题标题】:Merge immediate next rows together - R将下一行合并在一起 - R
【发布时间】:2017-12-04 03:11:01
【问题描述】:

这就是我的 df 的样子,

Region  Dummy value1 value2
Mangonui  NA   NA     NA
Sales     NA   9      6
Kaitaia   NA   NA     NA
Sales     NA   16     1
Whangaroa NA   NA     NA
Sales     NA   2      2

重新生成它的步骤,

 structure(list(Region = c("Mangonui", "Sales", "Kaitaia", 
"Sales", "Whangaroa", "Sales"), Dummy = c(NA, 
NA, NA, NA, NA, NA), Dweling_values = c(NA, "9", NA, "16", NA, 
"2"), Section_values = c(NA, "6", NA, "1", NA, "2")), .Names = c("Region", 
"Dummy", "value1", "value2"), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

如何将这两行合并在一起,以便根据地区名称获取销售额?所以输出应该是这样的,

Region  Dummy value1 value2
Mangonui  NA   9      6
Kaitaia   NA   16     1
Whangaroa NA   2      2

【问题讨论】:

    标签: r dplyr tidyr reshape2


    【解决方案1】:

    base R中的简单重新排列

    myNew <- cbind(df$Region[seq.int(1,nrow(df),2)], df[seq.int(2,nrow(df),2), 2:4])
    names(myNew) <- names(df)
    
    myNew
         Region Dummy value1 value2
    2  Mangonui    NA      9      6
    4   Kaitaia    NA     16      1
    6 Whangaroa    NA      2      2
    


    更新
    到目前为止,@thelatemail 给出了最优雅的解决方案

    cbind(df[1][c(TRUE,FALSE),,drop=FALSE], df[-1][c(FALSE,TRUE),])
         Region Dummy value1 value2
    1  Mangonui    NA      9      6
    3   Kaitaia    NA     16      1
    5 Whangaroa    NA      2      2
    

    【讨论】:

    • 如果您小心选择,您可以保留名称 - cbind(df[1][c(TRUE,FALSE),,drop=FALSE], df[-1][c(FALSE,TRUE),])
    【解决方案2】:

    首先,您需要找到并责骂以这种形式向您提供数据的人。告诉他们,如果他们继续这样做,您将不会与他们成为朋友。然后,只需使用一些简单的基本 R 函数:

    # generate indices for the sales and region rows
    sales_rows <- seq(2, nrow(df), by = 2)
    region_rows <- seq(1, nrow(df), by = 2)
    
    # subset to create the df you really want
    sales_df <- df[sales_rows, ]
    # use just the names from the region rows
    regions <- df[region_rows, "Region"]
    sales_df$Region <- regions
    
    # > sales_df
    #      Region Dummy value1 value2
    # 2  Mangonui    NA      9      6
    # 4   Kaitaia    NA     16      1
    # 6 Whangaroa    NA      2      2
    

    【讨论】:

    • 哈哈.. 当然。谢谢。
    【解决方案3】:

    使用dplyrtidyr 的解决方案。想法是使用recodeSales 替换为NA,使用fill 根据前面的行估算那些NA,然后使用filter_at 过滤具有任何非NA 值的行在其他列中。

    library(dplyr)
    library(tidyr)
    
    dt2 <- dt %>%
      mutate(Region = recode(Region, `Sales` = NA_character_)) %>%
      fill(Region) %>%
      filter_at(vars(-Region), any_vars(!is.na(.)))
    dt2
    # # A tibble: 3 x 4
    #      Region Dummy value1 value2
    #       <chr> <lgl>  <chr>  <chr>
    # 1  Mangonui    NA      9      6
    # 2   Kaitaia    NA     16      1
    # 3 Whangaroa    NA      2      2
    

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多