2013-11-06 1 views
1

Так что я довольно много нашел для ответа на этот вопрос, но не могу найти ответ, который удовлетворяет мои потребности или мое понимание R .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 

Так что у меня здесь есть набор данных, содержащий обилие сельди разных возрастов в разные областей («Подразделение») со временем. H1 означает сельдь в возрасте 1 года. Мой реальный набор данных содержит больше возрастов, а также больше областей (и дополнительных видов рыб).

Что я хотел бы сделать, это объединить обилие разных возрастов в один столбец, сохранив связанные данные (Год, Подраздел), а также создав новый столбец для 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 

Примечание: Да, я удалил несколько строк, но только не загромождать экран

Я надеюсь, что это достаточно информации для принятия его понятным, что мне нужно, и для кого-то, чтобы помочь ,

Поскольку у меня есть больше видов рыб, если кто-то хотел бы включить описание для добавления столбца Species, это было бы полезно. Вот код для одних и тех же данных, просто дублируется для кильки (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)) 

Ура!

Я не думаю, что теги этого вопроса должны быть несвязаны, но если вы не найдете теги, соответствующие моему вопросу, идите в голову и измените.

+0

Что касается ваших тегов, [tag: dataframes] - неправильный тег для использования с [tag: r]. Вместо этого используйте [tag: data.frame]. – A5C1D2H2I1M1N2O1R2T1

ответ

7

Это типичный Reshape то дополнить задачу, так что вы можете:

1) «Melt» данные с 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]") 

Я рекомендую вам посмотреть функции перекроить, поскольку они очень часто требуется, и обучение их поможет вам сэкономить много времени в е uture http://www.statmethods.net/management/reshape.html

+0

Спасибо, человек! Это фиксировало это без проблем. Я обязательно заберу reshape2. Еще раз спасибо! – balconydoor

6

Я думаю, что основная функция data.frame будет делать именно то, что вы хотите. Попробуйте что-то вроде:

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

Так что я конкатенация значения, которые вы хотите в колонке изобилия, и создать новый столбец, который только возрасты реплицируются для каждой строки. Вы можете легко создать подобный столб.

Надеюсь, что это поможет!

+0

Стоит отметить, что если бы у вас было много рыбы и много веков, с этим методом было бы трудно справиться, но это очень жизнеспособное решение на небольшом известном образце. –