【问题标题】:Pivot/merge some columns in a dataset while keeping remaining columns旋转/合并数据集中的某些列,同时保留剩余的列
【发布时间】:2021-06-25 13:37:48
【问题描述】:

我有一个类似的数据集(但有更多列):

table <- "year site square triangle circle
1  2019    A 3 9 5
2  2019    A 5 NA 34
3  2019    B 0 0 69
4  2019    B NA 111 2
5  2020    C 0 45 3
6  2020    C 29 0 NA 
7  2020    D NA 0 1
8  2021    D 3 NA 4
9  2021    D 158 5 0
10 2021    D 2 9 0"

df <- read.table(text=table, header = TRUE)
df

我想旋转表格的一部分,使其类似于以下内容:

   year site type count
1  2019    A square   3
2  2019    A triangle 9
3  2019    A circle   5
4  2019    A square   5
5  2019    A triangle NA
6  2019    A circle   34
7  2019    B square   0
8  2019    B triangle 0 
9  2019    B circle  60

(等等)

我已经尝试过来自 here 的解决方案,但这不涉及计数,所以当我使用这些解决方案时我失去了这个价值。

例如,下面的代码让我在每列中都留下了 NA,我丢失了计数值

df2 <- df[1:2]
df2$type <- apply(df[3:5], 1, function(k) names(df[3:5])[k])
df2

   year site             type
1  2019    A   circle, NA, NA
2  2019    A       NA, NA, NA
3  2019    B               NA
4  2019    B NA, NA, triangle
5  2020    C       NA, circle
6  2020    C           NA, NA
7  2020    D       NA, square
8  2021    D   circle, NA, NA
9  2021    D           NA, NA
10 2021    D     triangle, NA

我也尝试过使用 tidyr gather() 包,但这不允许我保留多个列。


library(tidyr)
df3 <- gather(df, year, site, `square`:`circle`)
head(df3)

    year site
1 square    3
2 square    5
3 square    0
4 square   NA
5 square    0
6 square   29

我唯一的想法是在我的数据框中创建一个新的唯一数字 (1-X) 列,将其与 gather() 一起使用,然后通过该唯一 ID 合并原始数据框和新数据框,然后删除不需要的列.这可行,但我想知道是否有更好、更清洁的解决方案?

【问题讨论】:

  • jl748795,Stack 的标签推荐引擎充其量是“不完美”的,请注意它建议的标签并对其提出更多批评:rstudio(已删除)纯粹是为了提问关于 IDE 本身,而不是 R 语言。

标签: r pivot pivot-table tidyr


【解决方案1】:

tidyr::pivot_longer怎么样:

library(tidyr)

tidyr::pivot_longer(df, -c(year, site))
#> # A tibble: 30 x 4
#>     year site  name     value
#>    <int> <chr> <chr>    <int>
#>  1  2019 A     square       3
#>  2  2019 A     triangle     9
#>  3  2019 A     circle       5
#>  4  2019 A     square       5
#>  5  2019 A     triangle    NA
#>  6  2019 A     circle      34
#>  7  2019 B     square       0
#>  8  2019 B     triangle     0
#>  9  2019 B     circle      69
#> 10  2019 B     square      NA
#> # … with 20 more rows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多