【问题标题】:Converting R Column names into id variables将 R 列名称转换为 id 变量
【发布时间】:2013-04-11 11:20:22
【问题描述】:

我很困惑,甚至无法搜索我要查找的内容。我对不同国家/地区进行了多年调查,目前是这样的:

 问题年份 CountryA CountryB ... CountryZ
        1 1999 是 否 否
        2 1999 是 是 是

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

国家年份问题答案 A 1999 1 是 A 1999 2 是 B 1999 1 无 B 1999 2 是

等等。这甚至可能吗?我似乎找不到任何可以指导我找到正确答案的东西。
提前致谢!

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    最直接的方法是使用“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))
    

    【讨论】:

      【解决方案2】:

      遵循@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列的级别了……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2021-06-02
        • 1970-01-01
        相关资源
        最近更新 更多