重塑R中的问题:我的重新整形数据框将3个变量更改为1

时间:2016-10-27 16:05:04

标签: r reshape

我是R的相对新手,并尝试将我的数据从宽格式转换为长格式并出现问题。我认为我的问题可能是由于我在R中创建的data.frame创建了data.frame,将大数据的平均值转换为另一个data.frame。

我所做的是创建了一个空的data.frame(ndf):

ndf <- data.frame(matrix(ncol = 0, nrow = 3))

然后使用lapply从大型data.frame(ldf)中获取新数据框中的单独列,并从大数据框中使用年份:

ndf$Year <- names(ldf)
ndf$col1 <- lapply(ldf, function(i) {mean(i$col1)})
ndf$col2 <- lapply(ldf, function(i) {mean(i$col2)})
etc.

reshape2中的融化函数显然不起作用,因为存在非原子“度量”列。

对于使用重塑基函数,我使用了代码:

reshape.ndf <- reshape(ndf, 
                    varying = list(names(ndf)[2:7]), 
                    v.names = "cover",
                    timevar = "species",
                    times = names(ndf[2:7]),
                    new.row.names = 1:1000,
                    direction = "long")

我的输出基本上只是使用变量的第一行。所以我的宽数据框架看起来像这样(对于奇怪的名字感到抱歉):

Year Cladonia.portentosa Erica.tetralix Eriophorum.vaginatum  
1 2014               11.75             35                   55     
2 2015               15.75          25.75                   70      
3 2016               22.75              5                 37.5

long data.frame看起来像这样:

Year             species cover id
1 2014 Cladonia.portentosa 11.75  1
2 2015 Cladonia.portentosa 11.75  2
3 2016 Cladonia.portentosa 11.75  3
4 2014      Erica.tetralix 35.00  1
5 2015      Erica.tetralix 35.00  2
6 2016      Erica.tetralix 35.00  3

“封面”栏中每年的值应与相应的年份一起放入单元格。

请有人告诉我哪里出错了??

3 个答案:

答案 0 :(得分:0)

以下是&#39;融化&#39;在tidyr

您需要tidyr,但我也喜欢dplyr,并将其包含在此处,以鼓励其与其他整数用户一起使用。你会在网上找到无穷无尽的精彩教程......

library(dplyr)
library(tidyr)

让我们以虹膜为例,我想要一个长形式,其中物种,变量和值是列。

data(iris)

这是gather()。我们指定变量和值是新&#39;熔化&#39;的列名。列。我们还指定我们不想要熔化我们想要保留其自己列的列物种。

iris_long <- iris %>%
  gather(variable, value, -Species)

检查iris_long对象以确保它有效。

答案 1 :(得分:0)

除了罗马的回答之外,我想我会完全分享我对数据集的所作所为。

我最初的&#34;宽&#34; data.frame ndf看起来像这样:

Year Cladonia.portentosa Erica.tetralix Eriophorum.vaginatum  
1 2014               11.75             35                   55     
2 2015               15.75          25.75                   70      
3 2016               22.75              5                 37.5

我使用了下载的tidyr

install.packages("tidyr")

然后选择了包

library(tidyr)

然后,我使用gather()包中的tidyr函数将speciesCladonia.portentosa Erica.tetralixEriophorum.vaginatum收集到一列中,在新的&#34;长&#34;中有一个cover列data.frame。

long.ndf <- ndf %>% gather(species, cover, Cladonia.portentosa:Eriophorum.vaginatum)

轻松自在! 再次感谢罗马的建议!

答案 2 :(得分:0)

我正在回答您的问题,以防它可能对使用reshape函数的人有所帮助。

请有人能告诉我我哪里出问题了吗??

您尚未指定参数idvar,并且reshape为您创建了一个名为id的参数。为了避免这种情况,只需在代码中添加idvar = "Year"行:

ndf <- read.table(text = 
  "Year Cladonia.portentosa Erica.tetralix Eriophorum.vaginatum
    1 2014               11.75             35                   55     
    2 2015               15.75          25.75                   70      
    3 2016               22.75              5                 37.5", 
  header=TRUE, stringsAsFactors = F)

reshape.ndf <- reshape(ndf, 
  varying = list(names(ndf)[2:4]), 
  v.names = "cover",
  idvar = "Year",
  timevar = "species",
  times = names(ndf[2:4]),
  new.row.names = 1:9,
  direction = "long")

结果与您预期的一样

reshape.ndf
  Year              species cover
1 2014  Cladonia.portentosa 11.75
2 2015  Cladonia.portentosa 15.75
3 2016  Cladonia.portentosa 22.75
4 2014       Erica.tetralix 35.00
5 2015       Erica.tetralix 25.75
6 2016       Erica.tetralix  5.00
7 2014 Eriophorum.vaginatum 55.00
8 2015 Eriophorum.vaginatum 70.00
9 2016 Eriophorum.vaginatum 37.50