【问题标题】:R stats, transforming parts of a data matrixR stats,转换部分数据矩阵
【发布时间】:2016-01-05 21:12:33
【问题描述】:

我对 StackOverflow 和 R 统计数据都是新手,所以请多多包涵。 我在 SAS 编码方面有很多经验,但我正在努力学习 R。 我通常使用 SAS 和 R 来转换大型数据集,我有一个按研究站点矩阵划分的物种如下:

物种状态角色 Site1 Site2 Site3...Site25 A_a S P 0 0 0 1 A_b SO X 1 25 0 0 B_a S P 0 2 1 1 B_b S X 0 1 0 0 ...

我想转换此表并根据站点变量名称和每个站点内的计数数据创建 2 个名为“站点”和“计数”的新变量:

物种状态角色站点计数 A_a S P 站点 1 0 A_a S P 站点 2 0 A_a S P Site3 0 A_a S P Site25 1 A_b SO X Site1 1 A_b SO X Site2 25 A_b SO X Site3 0 A_b SO X Site25 0 ... B_b S X Site25 0

我认为这可能超出了简单的 t() 函数,并且已经研究了 reshape 和 reshape2 包,但是对于如何进行有点迷茫。会有人遇到这样的情况并且可以帮助编码吗? 谢谢,吉姆

【问题讨论】:

  • 使用reshape2::melt
  • 你试过melt(data, c("Species", "Status", "Role"), value.name="Count")吗?
  • 如果您能提供一个最小的可重现示例来解决您的问题,那就太好了。我们可以从中工作并使用它来向您展示如何回答您的问题。这样,将来其他人也可以适合您的问题以及随附的答案。您可以查看this SO post,了解如何在 R 中制作一个出色的可重现示例。
  • 另外,由于您来自 SAS,您可能会发现来自 UCLA 的 this Migrating to R for SAS/SPSS/Stata Users PDF 很有帮助。干杯!

标签: r transform transpose


【解决方案1】:

你可以使用 dplyr/tidyr 来做这样的事情:

install.packages(c("tidyr", "dplyr"), dependencies = TRUE)
library(dplyr)
library(tidyr)
df %>% gather(Site, Count, grep('Site', names(df))) %>% arrange(Species)

【讨论】:

    【解决方案2】:

    或者在base R中有点老派(我意识到代码可以更简洁,请随时优化),

    df <- structure(list(Species = structure(1:4, .Label = c("A_a", "A_b", 
    "B_a", "B_b"), class = "factor"), Status = structure(c(1L, 2L, 
    1L, 1L), .Label = c("S", "SO"), class = "factor"), Role = structure(c(1L, 
    2L, 1L, 2L), .Label = c("P", "X"), class = "factor"), Site1 = c(0L, 
    1L, 0L, 0L), Site2 = c(0L, 25L, 2L, 1L), Site3 = c(0L, 0L, 1L, 
    0L)), .Names = c("Species", "Status", "Role", "Site1", "Site2", 
    "Site3"), class = "data.frame", row.names = c(NA, -4L))
    df
    #>   Species Status Role Site1 Site2 Site3
    #> 1     A_a      S    P     0     0     0
    #> 2     A_b     SO    X     1    25     0
    #> 3     B_a      S    P     0     2     1
    #> 4     B_b      S    X     0     1     0
    
     reshape(df, 
       varying = c("Site1", "Site2", "Site3"), 
       v.names = "Count",
       timevar = "Site", 
       times = c("Site1", "Site2", "Site3"), 
       new.row.names = 1:1000,
       direction = "long")
    #>   Species Status Role  Site Count id
    #> 1      A_a      S    P Site1     0  1
    #> 2      A_b     SO    X Site1     1  2
    #> 3      B_a      S    P Site1     0  3
    #> 4      B_b      S    X Site1     0  4
    #> 5      A_a      S    P Site2     0  1
    #> 6      A_b     SO    X Site2    25  2
    #> 7      B_a      S    P Site2     2  3
    #> 8      B_b      S    X Site2     1  4
    #> 9      A_a      S    P Site3     0  1
    #> 10     A_b     SO    X Site3     0  2
    #> 11     B_a      S    P Site3     1  3
    #> 12     B_b      S    X Site3     0  4
    

    【讨论】:

    • 大家好,感谢您回复我的建议和意见。我将在我更大的数据集上尝试这些。我还下载了从 SAS 迁移到 R 的 pdf,内容非常丰富!
    • @JimH,这解决了你的问题吗?如果是这样,我们应该关闭问题。
    猜你喜欢
    • 2016-10-03
    • 2017-10-02
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2018-10-06
    • 2012-05-20
    相关资源
    最近更新 更多