Най-добрият начин за комбиниране и запазване на колони

Опитвам се да преоформя рамка с данни. Има 4 колони: искам да комбинирам 3 от тях и да запазя една. Вероятно е по-лесно да се разбере с пример:

Ето как изглежда:

year    x1  x2  x3
2000    4   3   9
2000    1   4   2
2002    4   3   7

Ето как трябва да изглежда след преоформянето:

year    x1
2000    4
2000    3
2000    9
2000    1   
2000    4   
2000    2   
2002    4   
2002    3   
2002    7

Всъщност прочетох няколко примера за комбиниране и трансформиране на колони, но единственият начин да направя това е като напиша функция. Сигурен съм, че има по-лесен начин, така че може ли някой да ми помогне с този проблем?

Благодаря предварително.


person Laura    schedule 30.12.2014    source източник
comment
Още едно: cbind(df[1], x1 = unlist(df[2:4]))   -  person Rich Scriven    schedule 30.12.2014


Отговори (3)


Можеш да опиташ

data.frame(year=rep(df$year,each=length(df)-1),x1=c(t(df[,-1])))

Или използвайте melt от reshape2. Но това ще даде резултат в различен ред

library(reshape2)
melt(df, id.var='year')[,-2]
person akrun    schedule 30.12.2014

Можете също да направите това с преоформяне на база R:

reshape(mydf, direction = "long", varying = 2:ncol(mydf), sep = "")
#     year time x id
# 1.1 2000    1 4  1
# 2.1 2000    1 1  2
# 3.1 2002    1 4  3
# 1.2 2000    2 3  1
# 2.2 2000    2 4  2
# 3.2 2002    2 3  3
# 1.3 2000    3 9  1
# 2.3 2000    3 2  2
# 3.3 2002    3 7  3

Или с merged.stack от моя пакет "splitstackshape" (но трябва да сте сигурни, че вашите колони "id" са уникални).

library(splitstackshape)
merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")
#    year .id .time_1 x
# 1: 2000   1       1 4
# 2: 2000   1       2 3
# 3: 2000   1       3 9
# 4: 2000   2       1 1
# 5: 2000   2       2 4
# 6: 2000   2       3 2
# 7: 2002   1       1 4
# 8: 2002   1       2 3
# 9: 2002   1       3 7

Можете да използвате merged.stack(getanID(mydf, "year"), var.stubs = "x", sep = "var.stubs")[, c("year", "x"), with = FALSE], ако искате да премахнете колоните ".id" и ".time_1".

person A5C1D2H2I1M1N2O1R2T1    schedule 30.12.2014
comment
Отсега нататък ще използвам splitstackshape за този вид задачи. Благодаря за страхотния пакет. - person Steven Beaupré; 30.12.2014

Използвайки gather() от пакета tidyr и dplyr можете да направите (но ще получите резултата в различен ред):

library(tidyr)
library(dplyr)

df %>%
  gather(variable, value, -year) %>%
  arrange(year)

Ще получите:

  year variable value
1 2000        x1     4
2 2000        x1     1
3 2000        x2     3
4 2000        x2     4
5 2000        x3     9
6 2000        x3     2
7 2002        x1     4
8 2002        x2     3
9 2002        x3     7

Ако искате да се отървете от имената на променливите и да запазите само стойностите:

df %>%
  gather(variable, value, -year) %>%
  select(-variable) %>%
  arrange(year)

Ще получите:

  year value
1 2000     4
2 2000     1
3 2000     3
4 2000     4
5 2000     9
6 2000     2
7 2002     4
8 2002     3
9 2002     7
person Steven Beaupré    schedule 30.12.2014