将R列名称转换为id变量

时间:2013-04-11 11:20:23

标签: r reshape

我很困惑,甚至无法搜索我正在寻找的东西。我对不同国家进行了多年的调查,目前是这样的:

        Question  Year  CountryA  CountryB  ...  CountryZ
        1         1999       Yes        No             No 
        2         1999       Yes        Yes            Yes

也就是说,它目前按问题组织。我希望按国家/地区,年份和问题编号排列数据:

Country  Year  Question  Answer
      A  1999         1     Yes
      A  1999         2     Yes
      B  1999         1      No
      B  1999         2     Yes

等等。这甚至可能吗?我似乎无法找到任何指导我正确答案的内容。
提前致谢!

2 个答案:

答案 0 :(得分:4)

最直接的方法是使用来自" reshape2"的melt。假设您的data.frame被调用" mydf":

> library(reshape2)
> melt(mydf, id.vars=1:2)
  Question Year variable value
1        1 1999 CountryA   Yes
2        2 1999 CountryA   Yes
3        1 1999 CountryB    No
4        2 1999 CountryB   Yes
5        1 1999 CountryZ    No
6        2 1999 CountryZ   Yes

更新

我的思绪并没有在如何正确处理基础reshape生成的名称,但您也可以这样做:

names(mydf) <- sub("Country", "Country.", names(mydf))
setNames(
  reshape(mydf, direction="long", idvar=1:2, varying=3:ncol(mydf)),
  c("Question", "Year", "Country", "Answer"))
#          Question Year Country Answer
# 1.1999.A        1 1999       A    Yes
# 2.1999.A        2 1999       A    Yes
# 1.1999.B        1 1999       B     No
# 2.1999.B        2 1999       B    Yes
# 1.1999.Z        1 1999       Z     No
# 2.1999.Z        2 1999       Z    Yes

其中:

mydf <- structure(list(Question = 1:2, Year = c(1999L, 1999L), CountryA = c("Yes", 
  "Yes"), CountryB = c("No", "Yes"), CountryZ = c("No", "Yes")), .Names = c("Question", 
  "Year", "CountryA", "CountryB", "CountryZ"), class = "data.frame", row.names = c(NA, -2L))

答案 1 :(得分:0)

遵循@Ananda

的方法
DF <- read.table(text="Question \t Year CountryA    CountryB    CountryZ
1   1999    Yes No  No
2   1999    Yes Yes Yes", sep="\t", header=T)

> DF
  Question Year CountryA CountryB CountryZ
1        1 1999      Yes       No       No
2        2 1999      Yes      Yes      Yes

DF <- melt(DF, id.vars=1:2, value.name="Answer", variable.name="Country")

> DF
  Question Year  Country Answer
1        1 1999 CountryA    Yes
2        2 1999 CountryA    Yes
3        1 1999 CountryB     No
4        2 1999 CountryB    Yes
5        1 1999 CountryZ     No
6        2 1999 CountryZ    Yes

然后只需更改Country列的级别......