【问题标题】:How would I spread column values based on the combination of other 2 columns In R? [duplicate]我将如何根据 R 中其他 2 列的组合来扩展列值? [复制]
【发布时间】:2017-10-27 19:39:13
【问题描述】:

我广泛搜索并找到了多个关于类似情况的问题和答案,但不是我在这里面临的问题,所以我依赖于提出这个问题。

我在 R 中有一个具有这种结构的凌乱数据框,我只是通过在连接到存储了所有数据的数据库后在 R 中运行查询来获得它。

id     location     year     category     subCategory     numericValue  Unit
 1      place_1      1960      cat_1          subcat_1           34.567  kg
 2      place_1      1961      cat_1          subcat_1          564.566  kg
 3      place_1      1962      cat_1          subcat_1           3.4356  kg
 4      place_1      1963      cat_1          subcat_1           654.44  kg
 5      place_1      1960      cat_1          subcat_2           409.65  cm
 6      place_1      1961      cat_1          subcat_2           985545  cm
 7      place_1      1962      cat_1          subcat_2           5436.4  cm
 8      place_1      1963      cat_1          subcat_2           324.23  cm
...        
...
...     
341      place_1      1960      cat_2          subcat_1          487.65  cm³
342      place_1      1961      cat_2          subcat_1          434.65  cm³
343      place_1      1962      cat_2          subcat_1          421.65  cm³
344      place_1      1963      cat_2          subcat_1           87.65  cm³
345      place_1      1960      cat_2          subcat_2            0.33  ton
346      place_1      1961      cat_2          subcat_2            1.65  ton
347      place_1      1962      cat_2          subcat_2            89.2  ton
348      place_1      1963      cat_2          subcat_2            1345  ton
...
...
12334    place_2      1960      cat_1          subcat_1            1111  kg
12334    place_2      1961      cat_1          subcat_1            2222  kg
12334    place_2      1962      cat_1          subcat_1            3333  kg
12334    place_2      1960      cat_1          subcat_2            4444  cm
12334    place_2      1961      cat_1          subcat_2            5555  cm
12334    place_2      1962      cat_1          subcat_2            6666  cm
...
...
...
99999    place_67     1982      cat_5          subcat_9           3455 Watt  

尝试解释发生了什么: 我有一个数值,实际数据,测量并分类为类别和子类别,它是在给定年份的某个位置获得的。 给定位置的类别+子类别的组合有几年的时间段,并且一直持续到在所有年份和每个类别及其子类别中观察到所有位置。

我想要获得的是一个数据框,它将每个类别+子类别组合在一起,并在其价值下测量数据,有效地将一个很长的数据框变成一个很宽的数据框。

id  location  year  cat_1.subcat_1  cat_1.subcat_2  ...  cat_5.subcat_9
 1  place_1   1960       34.567          409.65                  NA
 2  place_1   1961      564.566          985545                  NA
 3  place_1   1962       3.4356          5436.4                 444
 4  place_1   1963       654.44          324.23                 0.5
 5  place_2   1960         1111            4444            3.22e-04
...
350 place_67  1982           NA              NA                3455

我可以通过我在数据库上创建的一个过程来实现这一点,该过程已经存储了所有这些,但是运行它非常昂贵。我不知道如何处理 Unity 列,我认为我不能将它合并到任何地方,因为它是测量本身所独有的,而不是像类别/子类别这样的组合,但如果它最终被丢弃并不重要.

如果事情不是很清楚,我可以回答任何疑问。

谢谢!

【问题讨论】:

  • 我看到它确实与我的问题相似。但是有没有办法保留 Unit 列?
  • 'Unit' 只是组内的一个常量,所以将它与 id/location 一起添加到 id 变量列表中。
  • 我尝试了你前面提到的问题的答案,使用 reshape 并将 Unit 应用于 id 变量的向量,但不幸的是,无论有没有 Unit,该方法都不起作用,显示以下错误粘贴错误( rep(l, length(lvs)), rep(lvs, each = length(l)), sep = sep) 不能分配长度为 1695223112 的向量但是好的方面是 tidyverse 对您指定重复的同一问题的响应有效,但是当然没有Unit。这是一种损失,但正如我提到的那样并不重要
  • 哇...你的数据有多大,你最终得到了一个 1.7 b百万长度的向量?我认为那里出了点问题,很明显。也许 id 不应该是 idvars 的一部分,因为它本质上只是一个行号。
  • 非常感谢您指出另一个帮助我解决问题的问题。:)

标签: r dataframe reshape2 tidyverse


【解决方案1】:

你可以寻找那个( tidyverse ):

 ## Building fake dataset
  df <- expand.grid(location = c("place1", "place2"),
              catg = c("cat1", "cat2"),
              subcateg = c("subcat1", "subcat2", "subcat3"),
              year = (2000:2001))
  df$value <- rpois(nrow(df), 10)

## the operation you may look for
  df %>% unite(catg.subcateg, catg,subcateg) %>% spread(catg.subcateg, value)

【讨论】:

  • 我很欣赏这个答案,我尝试将它应用到这个问题上,但我也有一些差异,但我没有得到想要的结果,它与 Unit 列交互的方式和/或预计不会有其他列。不过还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多