Лучший способ объединить и сохранить столбцы

Я пытаюсь изменить структуру данных. У него 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