R - 在数据帧内将多个列组合在一起,同时保持连接数据

时间:2013-11-06 14:08:53

标签: r dataframe multiple-columns reshape calculated-columns

所以我对这个问题的答案看起来很多,但我找不到满足我的需要或我对R的理解的答案。

首先,这里有一些代码可以让您了解我的数据集是什么样的

df <- data.frame("Year" = 1991:2000, "Subdiv" = 24:28, H1 = c(31.2,34,70.2,19.8,433.7,126.34,178.39,30.4,56.9,818.3),
             H2 = c(53.9,121.5,16.9,11.9,114.6,129.9,221.1,433.4,319.2,52.6))             
> df
   Year Subdiv     H1    H2
1  1991     24  31.20  53.9
2  1992     25  34.00 121.5
3  1993     26  70.20  16.9
4  1994     27  19.80  11.9
5  1995     28 433.70 114.6
6  1996     24 126.34 129.9
7  1997     25 178.39 221.1
8  1998     26  30.40 433.4
9  1999     27  56.90 319.2
10 2000     28 818.30  52.6

所以我在这里得到的是一个数据集,其中包含不同时期(“Subdiv”)不同年龄段的丰富鲱鱼。 H1代表1岁时的鲱鱼。我的真实数据集包含更多的年龄以及更多的区域(和其他种类的鱼类)。

我想要做的是将不同年龄段的丰富度合并到一个列中,同时保留连接数据(Year,Subdiv)以及为Age创建新列。 像这样:

       Year Subdiv   Abun   Age
    1  1991     24  31.20    1
    2  1992     25  34.00    1
    3  1993     26  70.20    1
    4  1994     27  19.80    1
    5  1995     28 433.70    1 
    6  1991     24   53.9    2
    7  1992     25  121.5    2
    8  1993     26   16.9    2
    9  1994     27   11.9    2
   10  1995     28  114.6    2

注意:是的,我删除了一些行,但只是为了不占用屏幕

我希望这些信息足以让我理解我需要什么以及帮助别人。

由于我有更多种类的鱼,如果有人想要包含添加物种列的描述,那将会有所帮助。 这是相同数据的代码,只是为sprat(Sn)重复:

df <- data.frame("Year" = 1991:2000, "Subdiv" = 24:28, H1 = c(31.2,34,70.2,19.8,433.7,126.34,178.39,30.4,56.9,818.3),
                 H2 = c(53.9,121.5,16.9,11.9,114.6,129.9,221.1,433.4,319.2,52.6),
                 S1 = c(31.2,34,70.2,19.8,433.7,126.34,178.39,30.4,56.9,818.3),
                 S2 = c(53.9,121.5,16.9,11.9,114.6,129.9,221.1,433.4,319.2,52.6)) 

干杯!

我不认为这个问题的标签应该是不相关的,但是如果你没有找到适合我的问题的标签,那就先去改变吧。

2 个答案:

答案 0 :(得分:7)

这是一个典型的重塑然后补充任务,所以你可以:

1)使用reshape2“融化”您的数据

library("reshape2")
df.m<-melt(df,id.vars=c("Year","Subdiv"))

2)然后根据保存先前df列名的变量列添加其他列

library("stringr")
df.m$Fish<-str_extract(df.m$variable,"[A-Z]")
df.m$Age<-str_extract(df.m$variable,"[0-9]")

我建议您查找重塑功能,因为这些通常是必需的,学习它们将为您节省大量时间 http://www.statmethods.net/management/reshape.html

答案 1 :(得分:6)

我认为基本的data.frame函数将完全符合您的要求。尝试类似:

data.frame(df$Year,df$Subdiv,Abun=c(df$H1,df$H2),
  Age=rep(c(1,2),each=nrow(df)))

因此,我在丰富列中连接您想要的值,并创建一个新列,该列只是为每行复制的年龄。您可以轻松创建类似的物种列。

希望有所帮助!