将两列数据转换为一个具有其他列类型的列

时间:2015-11-05 17:38:13

标签: r reshape

我有以下数据框:

  Letter TimesInChapt1 TimesInChapt2
      A           100           111
      B           200           222
      C           300           333

我想将其转换为以下内容:

  Letter        Times     ChapterNum
      A           100           1
      B           200           1
      C           300           1
      A           111           2
      B           222           2
      C           333           2

这是dput。

structure(list(Letter = structure(1:3, .Label = c("A", "B", "C"
), class = "factor"), TimesInChapt1 = c(100, 200, 300), 
TimesInChapt2 =     c(111, 
222, 333)), .Names = c("Letter", "TimesInChapt1", "TimesInChapt2"
), row.names = c(NA, -3L), class = "data.frame")

我可以使用rbind让它工作,但我想知道是否有一个我不了解的更好的解决方案。棘手的部分是保存数据来自哪一列。

2 个答案:

答案 0 :(得分:1)

我们可以使用dplyrtidyr。首先我们gather使数据变长而不是宽,然后我们extract_numeric只得到章节的数字部分:

library(dplyr)
library(tidyr)
dat %>% gather(ChapterNum, Times, -Letter) %>%
        mutate(ChapterNum = extract_numeric((ChapterNum)))

  Letter ChapterNum Times
1      A          1   100
2      B          1   200
3      C          1   300
4      A          2   111
5      B          2   222
6      C          2   333

答案 1 :(得分:1)

人们说基础R中的reshape函数很难学习,对于某些应用程序来说,它可能是一个挑战。但是,如果您的数据已经很好地构建,就像在这种情况下一样,使用它是一件轻而易举的事情:

reshape(mydf, direction = "long", idvar = "Letter", varying = 2:3, sep = "")
#     Letter time TimesInChapt
# A.1      A    1          100
# B.1      B    1          200
# C.1      C    1          300
# A.2      A    2          111
# B.2      B    2          222
# C.2      C    2          333

您也可以尝试{" splitstackshape"}中的merged.stack包,可以像:

一样使用
library(splitstackshape)
merged.stack(mydf, var.stubs = "TimesInChapt", sep = "var.stubs")