【问题标题】:How can I reshape the dataframe so there is only 1 observation for each id?如何重塑数据框,以便每个 id 只有 1 个观察值?
【发布时间】:2021-07-23 22:42:20
【问题描述】:

我需要重塑(我假设它是某种重塑,就像我在 stata 中所做的那样)这个数据框,以便每个 id 只有 1 个观察值。此外,我需要保留所有其他变量。因此,一行应该有 id 列,每年包含 var1、x、var2 的值(var2 不是绝对必要的。我尝试了很多不同的东西,并且我不断为 id 变量获得相同的长数据. 我为冗长的 dput() 道歉,但如果我只做了前 6 行,就不会有信息。

  structure(list(id= c(1806968L, 1806968L, 1806968L, 1806968L, 
        1806968L, 1806968L, 1806968L, 1806968L, 1806968L, 1806968L, 1806968L, 
        1806968L, 1806968L, 1806968L, 1806968L, 2022610L, 2022610L, 2022610L, 
        2022610L, 2022610L), var1 = c(0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 4877, 5819, 6560, 8262, 0, 0, 0, 0, 0), x = c(25518, 
        25518, 25518, 25518, 25518, 25518, 25518, 25518, 25518, 25518, 
        25518, 25518, 25518, 25518, 25518, 34611, 34611, 34611, 34611, 
        34611), var2 = c(200812L, 200912L, 201012L, 201112L, 201212L, 
        201312L, 201512L, 201612L, 201712L, 201812L, 201912L, 200612L, 
        200512L, 200712L, 201412L, 199612L, 199712L, 199812L, 199912L, 
        200012L), `1987` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0), `1988` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0), `1989` = c(0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1990` = c(0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1991` = c(0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1992` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1993` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1994` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1995` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1996` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1997` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1998` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `1999` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2000` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2001` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2002` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2003` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2004` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2005` = c(0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5819, 0, 0, 0, 0, 0, 0, 0), 
            `2006` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4877, 0, 0, 0, 
            0, 0, 0, 0, 0), `2007` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 6560, 0, 0, 0, 0, 0, 0), `2008` = c(0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2009` = c(0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
            `2010` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0), `2011` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0), `2012` = c(0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2013` = c(0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
            `2014` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8262, 
            0, 0, 0, 0, 0), `2015` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2016` = c(0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `2017` = c(0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
            `2018` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0), `2019` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0), `2020` = c(0, 0, 0, 0, 0, 0, 
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 
        -20L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x55b410de6890>, sorted = c("id", 
        "var1", "x", "var2"))

我希望它看起来像这样,每年的值是与那一年对应的 var1 的值。这是我多年来想要的东西。多年来我仍然需要一个专栏。

id <- c(1806968L, 2022610L)
"1987" <- c(0, 8262)
x <- c(25518, 34611)
data <- data.frame(id, `1987`, x)

【问题讨论】:

  • tidyr::pivot_longer() 是你想要的
  • 你能举一个小例子来说明你希望你的输出是什么样的吗?你的描述很复杂。
  • @dash2 我刚刚编辑了一些类似于我正在寻找的东西,但只有 1 年而不是所有年份。
  • 还是一头雾水。为什么在您的示例中x1987 等于 8262 的 id 2022610?
  • @dash2,因为 var1 的值会填入 x1987。在更大的数据集中,id 20022610 的 var1 的值为 8262。

标签: r dataframe reshape


【解决方案1】:

不清楚您是否还想要 x 为 0 时为 0 的年份。如果需要,请删除下面的 &amp; var1 &gt; 0

library(tidyr)
library(dplyr)
tmp %>%
      tidyr::pivot_longer(c(starts_with("1"), starts_with("2")), names_to = "year") %>%
      filter(value == var1 & var1 > 0) %>% 
      select(-value)

【讨论】:

  • 谢谢。我得到:错误:'pivot_longer' 不是从 'namespace:tidyr' 导出的对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2014-04-29
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多