【问题标题】:Reorganize/reshape data frame [duplicate]重组/重塑数据框[重复]
【发布时间】:2017-03-29 23:21:47
【问题描述】:

我有一个实时捕获的数据框。有两个系统,每个系统都有不同的状态。给出了每个状态的周数和人数。

df <- data.frame (sys = rep(c("a","b"), each=3), 
              sta = rep(c("L","T","P"), times=2), 
              w01 = c("0","2","5","2","2","5"),
              w02 = c("3","2","2","4","6","1"),
              w03 = c("4","1","0","5","3","0"))
df
sys  sta  w01  w02  w03
a    L    0    3    4
a    T    2    2    1
a    P    5    2    0
b    L    2    4    5
b    T    2    6    3
b    P    5    1    0

我想要一个显示每个数字的系统和状态的数据框。结果如下所示:

sys sta Num
a   L   0
a   L   3
a   L   4
a   T   2
a   T   2
a   T   1
a   P   5
a   P   2
a   P   0
b   L   2
b   L   4
b   L   5
b   T   2
b   T   6
b   T   3
b   P   5
b   P   1
b   P   0

我完全不知道如何做到这一点。我找到了这两个问题/答案 Reorganise 2x36 dataframe to a 6x6 dataframe. Dice throw visualisation Reshaping data.frame from wide to long format 但找不到适合我的问题的方法。 我也尝试了reshape,但direction = "wide" 没有给出我需要的输出,我被direction = "long" 的不同部分吸引住了。这是我尝试过的,但没有奏效......

a <- as.vector(colnames(df[-c(1,2)]))
df2 <- reshape(df, idvar = "sys", timevar = "sta", varying = a , direction = "long")

有什么建议可以解决这个问题吗? 谢谢大家和亲切的问候!

P.S.:我需要数据集的“新格式”来进行 Friedman 测试 (friedman.test)。会这样吗?

【问题讨论】:

  • stackoverflow.com/questions/2185252/… 正是您所需要的,您是否尝试过那里的其他解决方案?
  • df2 &lt;- reshape(df, idvar = c("sys", "sta"), varying = c('w01', 'w02', 'w03'), direction = "long", sep = '', new.row.names = 1:18) 为您提供所需的一切。不过,reshape 太可怕了;尝试学习reshape2tidyr 包。
  • 感谢您找到无需额外软件包的解决方案!如果我需要更频繁地进行这样的重组,我将学习使用这个包。但如果我只需要一次,我总是对不需要额外的解决方案感到满意。

标签: r reshape


【解决方案1】:

这是tidyverse 方法:

它是tidyr 包的一部分,包含在tidyverse

library(tidyverse)
out <- gather(df, key = 'week', value = 'number', -sys, -sta)

输出:

   sys sta week number
1    a   L  w01      0
2    a   T  w01      2
3    a   P  w01      5
4    b   L  w01      2
5    b   T  w01      2
6    b   P  w01      5
7    a   L  w02      3
8    a   T  w02      2
9    a   P  w02      2
10   b   L  w02      4
11   b   T  w02      6
12   b   P  w02      1
13   a   L  w03      4
14   a   T  w03      1
15   a   P  w03      0
16   b   L  w03      5
17   b   T  w03      3
18   b   P  w03      0

它是如何工作的:

  • gather 获取所有未排除的列。通过将select 语句传递给... 参数来处理排除。在这种情况下,我排除了syssta。因此,我们 gather 输入值的唯一列是 all_w
  • 此外,我们为 keyvalue 字段命名。关键字段将包含输出的每个元素(行)所取自的列名。 value 将包含该列中行的内容。
  • 我建议保留week,因为您以后可能想知道产生您的数字之一的曝光时间。如果没有,您可以使用df %&gt;% select(-week) 删除它。
  • 您可以通过spread(out, key = week, value = number) 撤消此转换。瞧,你的老df

【讨论】:

  • 感谢您的详细解释!这真的很有帮助。我经常无法调整代码,因为我不知道它在做什么。非常感谢!
  • 别担心,我的荣幸!我知道gather 并且传播一开始可能会令人困惑。稍微玩一下就可以了。其他 tidyr 函数也一样。并且确实使用tidyverse,这是十年来在 R 中发生的最好的事情!您可以从这里开始:cran.r-project.org/web/packages/dplyr/vignettes/…
【解决方案2】:

使用tidyrdplyr

library(tidyr)
library(dplyr)

df %>% 
    gather(key, value, -sys, -sta) %>% 
    select(-key) %>% 
    arrange(sys, sta)

#>    sys sta value
#> 1    a   L     0
#> 2    a   L     3
#> 3    a   L     4
#> 4    a   P     5
#> 5    a   P     2
#> 6    a   P     0
#> 7    a   T     2
#> 8    a   T     2
#> 9    a   T     1
#> 10   b   L     2
#> 11   b   L     4
#> 12   b   L     5
#> 13   b   P     5
#> 14   b   P     1
#> 15   b   P     0
#> 16   b   T     2
#> 17   b   T     6
#> 18   b   T     3

【讨论】:

  • 非常感谢!也许有一个不需要额外包的解决方案?
  • 哈哈,@GGamba,你打败了我。 Leips,使用 dplyr 或 tidyverse,值得!
【解决方案3】:

您可以从reshape2 使用melt

melt(df, id.vars = c("sys","sta"), value.name = "num")

#     sys sta variable num
# 1    a   L      w01   0
# 2    a   T      w01   2
# 3    a   P      w01   5
# 4    b   L      w01   2
# 5    b   T      w01   2
# 6    b   P      w01   5
# 7    a   L      w02   3
# 8    a   T      w02   2
# 9    a   P      w02   2
# 10   b   L      w02   4
# 11   b   T      w02   6
# 12   b   P      w02   1
# 13   a   L      w03   4
# 14   a   T      w03   1
# 15   a   P      w03   0
# 16   b   L      w03   5
# 17   b   T      w03   3
# 18   b   P      w03   0

如果要删除 variable 列,请使用

melt(df, id.vars = c("sys","sta"), value.name = "num")[,c(1,2,4)]

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2014-01-31
    相关资源
    最近更新 更多