【问题标题】:Convert multiple column headers to Values in R将多个列标题转换为 R 中的值
【发布时间】:2016-09-28 09:55:46
【问题描述】:

所以我的数据是以这种格式从excel导入的

                alpha 
         beta           gamma 
    var1 var2 var3 var1 var2 var3  
1     21   50    5   22   48    6        
2     27   50    5   24   48    6        
3     26   50    5   28   48    6    
4     25   50    5   28   48    6

我想把它转换成这种格式

    var1 var2 var3  var4 var5  
1     21   50    5  alpha beta            
2     27   50    5  alpha beta            
3     26   50    5  alpha beta      
4     25   50    5  alpha beta 
5     22   48    6  alpha gamma
6     24   48    6  alpha gamma
7     28   48    6  alpha gamma
8     28   48    6  alpha gamma

在 R 中可能有什么方法可以做到这一点。注意 alpha 是一级标题,beta 和 gamma 是二级标题,但在 R 中作为一行导入

这是 dput(文件)

    structure(list(X.group.age = structure(c(1L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L), .Label = c("", "19-15", 
"24-20", "29-25", "34-30", "39-35", "44-40", "49-45", "54-50", 
"59-55", "64-60"), class = "factor"), X1999. = structure(c(12L, 
11L, 4L, 3L, 8L, 7L, 6L, 5L, 2L, 1L, 10L, 9L), .Label = c("132486", 
"187238", "226157", "25755", "277822", "351166", "408307", "435447", 
"53084", "84800", "MALE", "BRITISH"), class = "factor"), 
    X. = structure(c(1L, 12L, 6L, 10L, 2L, 11L, 9L, 5L, 3L, 7L, 
    8L, 4L), .Label = c("", "102978", "11871", "1828", "24871", 
    "3720", "4136", "4526", "49072", "65049", "78375", "إناث"
    ), class = "factor"), X..1 = structure(c(1L, 3L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("", "NA", "TOTAL"
    ), class = "factor"), X..2 = structure(c(12L, 11L, 9L, 2L, 
    7L, 8L, 6L, 4L, 1L, 10L, 5L, 3L), .Label = c("171302", "204856", 
    "20740", "318726", "40116", "493643", "576850", "612027", 
    "8415", "93130", "MALE", "USA"), class = "factor"), 
    X..3 = structure(c(1L, 12L, 8L, 6L, 10L, 2L, 11L, 7L, 3L, 
    9L, 4L, 5L), .Label = c("", "158711", "18484", "2038", "2410", 
    "37816", "43444", "5089", "7134", "78785", "90155", "FEMALE"
    ), class = "factor"), X..4 = structure(c(1L, 12L, 3L, 6L, 
    10L, 11L, 9L, 7L, 4L, 2L, 8L, 5L), .Label = c("", "100264", 
    "13504", "189786", "23150", "242672", "362170", "42154", 
    "583798", "655635", "770738", "TOTAL"), class = "factor"), 
    X2000. = structure(c(12L, 11L, 6L, 3L, 8L, 7L, 5L, 4L, 2L, 
    1L, 10L, 9L), .Label = c("132830", "201634", "225389", "289188", 
    "364795", "38815", "419225", "443670", "59708", "97645", 
    "MALE", "BRITISH"), class = "factor"), X..5 = structure(c(1L, 
    12L, 6L, 9L, 2L, 11L, 8L, 5L, 3L, 10L, 7L, 4L), .Label = c("", 
    "103289", "14099", "2033", "27027", "3327", "4341", "49512", 
    "52910", "6867", "85007", "FEMALE"), class = "factor"), 
    X..6 = structure(c(1L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("", "NA", "TOTAL"), class = "factor"), 
    X..7 = structure(c(12L, 11L, 3L, 1L, 4L, 6L, 9L, 7L, 5L, 
    2L, 10L, 8L), .Label = c("115574", "177250", "19787", "267819", 
    "326709", "465506", "494696", "51245", "544286", "92696", 
    "male", "USA"), class = "factor"), X..8 = structure(c(1L, 
    12L, 8L, 5L, 7L, 2L, 11L, 10L, 6L, 9L, 4L, 3L), .Label = c("", 
    "106279", "1476", "3050", "32104", "36447", "52824", "6407", 
    "7497", "75029", "96487", "female"), class = "factor"), 
    X..9 = structure(c(1L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("", "NA", "Total"), class = "factor")), .Names = c("X.group.age", 
"X1999.", "X.", "X..1", "X..2", "X..3", "X..4", "X2000.", "X..5", 
"X..6", "X..7", "X..8", "X..9"), row.names = c(NA, -12L), class = "data.frame")

【问题讨论】:

  • 可以发dput(yourexample) 了解数据的结构吗?或者你读过 R 中的数据吗?
  • 最好通过跳过前两行(即dat <- read.csv("yourfile.csv", skip=2, stringsAsFactors=FALSE))来读取数据集,以避免将所有列转换为factor/character。然后阅读第一两行
  • 但是我的问题是如何将 alpha 值链接到 alpha 并将 beta 值链接到 beta。看看我的表格,我的主要问题是如何处理 Excel 表中的多个标题
  • 从 excel 表中删除多个标题,并更改标题以使其包含所有信息。并使用包reshape 根据您的规格重组您的数据。

标签: r excel dataframe


【解决方案1】:

在 Excel 中固定标题后,您可以执行以下操作来重塑数据。 (随机数据示例)。

library(reshape2)

dt <- data.frame(id = 1:100
                 ,beta_var1 = rnorm(100,mean = 4, sd = 2)
                 , beta_var2 = rnorm(100,mean = 7, sd = 3)
                 , gamma_var1 = rnorm(100,mean = 5, sd = 2)
                 , gamma_var2 = rnorm(100,mean = 5, sd = 3))
head(dt)

st1 <- melt(dt, id.vars = 'id')
head(st1)

st2 <- transform(st1, n = colsplit(st1$variable,"_", c("letter","var")))
head(st2)

st3 <- dcast(st2, id + n.letter ~ n.var)
head(st3)

来源

> head(dt)
id  beta_var1 beta_var2 gamma_var1 gamma_var2
1  1 0.09267697  8.756578   2.350164   7.774297
2  2 0.97311566  8.097634   9.793237   2.261395
3  3 2.08363376  7.566973   7.053660   3.725915
4  4 2.97215984 10.934154   4.767223   5.779393
5  5 2.21449327 11.794902   6.016574   5.998344
6  6 3.81294082  8.373939   5.257709   2.481696

输出

> head(st3)
id n.letter       var1     var2
1  1     beta 0.09267697 8.756578
2  1    gamma 2.35016370 7.774297
3  2     beta 0.97311566 8.097634
4  2    gamma 9.79323667 2.261395
5  3     beta 2.08363376 7.566973
6  3    gamma 7.05365982 3.725915

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多