【问题标题】:Wide to long, inconsistent column names宽到长、不一致的列名
【发布时间】:2020-07-10 09:16:20
【问题描述】:

我有以下数据框,您可以在此处以 CSV 格式获取:http://www.sharecsv.com/s/c4d94fd3a7dc43e3ec249bff373a0082/data.csv

我的colnames如下。如您所见,名称不是连续的(例如,缺少 Q1,没有 Q3 或 Q4,等等)。我需要保持这种状态。检查某些案例是否有一个无关紧要的附加“.1”。

  [1] "Q2_1"     "Q2_2"     "Q5_1"     "Q5_2"     "Q6_1"     "Q6_2"     "Q9_1"     "Q9_2"     "Q11_1"    "Q11_2"    "Q8_1"     "Q8_2"     "Q14_1"   
 [14] "Q14_2"    "Q16_1"    "Q16_2"    "Q10_1"    "Q10_2"    "Q11_1.1"  "Q11_2.1"  "Q19_1"    "Q19_2"    "Q20_1"    "Q20_2"    "Q21_1"    "Q21_2"   
 [27] "Q15_1"    "Q15_2"    "Q23_1"    "Q23_2"    "Q24_1"    "Q24_2"    "Q25_1"    "Q25_2"    "Q26_1"    "Q26_2"    "Q20_1.1"  "Q20_2.1"  "Q21_1.1" 
 [40] "Q21_2.1"  "Q29_1"    "Q29_2"    "Q30_1"    "Q30_2"    "Q35_1"    "Q35_2"    "Q36_1"    "Q36_2"    "Q37_1"    "Q37_2"    "Q38_1"    "Q38_2"   
 [53] "Q39_1"    "Q39_2"    "Q41_1"    "Q41_2"    "Q30_1.1"  "Q30_2.1"  "Q43_1"    "Q43_2"    "Q44_1"    "Q44_2"    "Q45_1"    "Q45_2"    "Q47_1"   
 [66] "Q47_2"    "Q48_1"    "Q48_2"    "Q36_1.1"  "Q36_2.1"  "Q37_1.1"  "Q37_2.1"  "Q51_1"    "Q51_2"    "Q52_1"    "Q52_2"    "Q53_1"    "Q53_2"   
 [79] "Q41_1.1"  "Q41_2.1"  "Q42_1"    "Q42_2"    "Q56_1"    "Q56_2"    "Q57_1"    "Q57_2"    "Q58_1"    "Q58_2"    "Q59_1"    "Q59_2"    "Q60_1"   
 [92] "Q60_2"    "Q61_1"    "Q61_2"    "Q62_1"    "Q62_2"    "Q63_1"    "Q63_2"    "Q64_1"    "Q64_2"    "Q65_1"    "Q65_2"    "Q53_1.1"  "Q53_2.1" 
[105] "Q54_1"    "Q54_2"    "Q68_1"    "Q68_2"    "Q75_1"    "Q75_2"    "Q57_1.1"  "Q57_2.1"  "Q58_1.1"  "Q58_2.1"  "Q59_1.1"  "Q59_2.1"  "Q60_1.1" 
[118] "Q60_2.1"  "Q61_1.1"  "Q61_2.1"  "Q81_1"    "Q81_2"    "Q82_1"    "Q82_2"    "Q83_1"    "Q83_2"    "Q87_1"    "Q87_2"    "Q88_1"    "Q88_2"   
[131] "Q89_1"    "Q89_2"    "Q90_1"    "Q90_2"    "Q91_1"    "Q91_2"    "Q92_1"    "Q92_2"    "Q93_1"    "Q93_2"    "Q94_1"    "Q94_2"    "Q95_1"   
[144] "Q95_2"    "Q74_1"    "Q74_2"    "Q75_1.1"  "Q75_2.1"  "Q76_1"    "Q76_2"    "Q77_1"    "Q77_2"    "Q100_1"   "Q100_2"   "Q101_1"   "Q101_2"  
[157] "Q102_1"   "Q102_2"   "Q103_1"   "Q103_2"   "Q104_1"   "Q104_2"   "Q105_1"   "Q105_2"   "Q106_1"   "Q106_2"   "Q107_1"   "Q107_2"   "Q108_1"  
[170] "Q108_2"   "Q113_1"   "Q113_2"   "Q114_1"   "Q114_2"   "Q117_1"   "Q117_2"   "Q96_1"    "Q96_2"    "Q97_1"    "Q97_2"    "Q98_1"    "Q98_2"   
[183] "Q121_1"   "Q121_2"   "Q103_1.1" "Q103_2.1" "Q104_1.1" "Q104_2.1" "Q127_1"   "Q127_2"   "Q128_1"   "Q128_2"   "Q129_1"   "Q129_2"  

问题:我需要将其从 WIDE 转换为 LONG,以获得如下内容:

QUESTION CASE VALUE
Q2        1     5
Q2        2     5
Q5        1     1
Q5        2     2

我尝试如下重塑,但不断收到不同的错误,我也不确定我是否正确拆分:

test <- reshape(data, sep = "_", times = c(1, 2), direction = "long", varying = colnames(data))

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    您可以使用pivot_longer 形式tidyr,在“_”处分隔:

    library(tidyr)
    
    pivot_longer(data, cols=everything(), names_sep="_",
                 names_to=c("Question","Case"))
    
    # A tibble: 194 x 3
       Question Case  value
       <chr>    <chr> <int>
     1 Q2       1         5
     2 Q2       2         5
     3 Q5       1         1
     4 Q5       2         2
     5 Q6       1         4
     6 Q6       2         4
     7 Q9       1         4
     8 Q9       2         4
     9 Q11      1         5
    10 Q11      2         3
    # ... with 184 more rows
    

    尝试使用reshape 函数会由于宽格式中的变量名不一致而导致错误。例如,正如您提到的,某些名称有一个额外的“.1”,您说这无关紧要。 tidyr 包同意这一点,因为它只是收集分隔符之后的所有内容,并将找到的任何内容放入“Case”变量(names_to 参数中的第二项)。 reshape 函数更严格。也就是说,附加的“.1”是 not 无关的(根据函数),因为函数将尝试猜测名称中包含的值(在“_”之后),看到长度不相等,并以'varying' arguments must be the same length 失败。

    下面给出了使用sep="" 的替代方法...

    【讨论】:

    • 确实!非常感谢!!
    【解决方案2】:

    由于您只想重塑一个类别“问题”(即不是更多类别,例如“问题”和“年份”),所有Q* 变量都可以被视为唯一(子)问题。

    因此,您可能希望separate by ""

    tmp <- reshape(dat[-1], varying=1:194, direction="long", sep="")
    

    其中并为您提供带有 time 变量的长格式,包括所有子问题。

    head(tmp, 3)
    #       time Q id
    # 1.2_1  2_1 5  1
    # 1.2_2  2_2 5  1
    # 1.5_1  5_1 1  1
    

    之后,您可以使用strsplittime 变量拆分为"_",使用setNames 为结果命名,然后对其进行排序。

    res <- setNames(data.frame(do.call(rbind, strsplit(tmp$time, "_")), tmp[2:3],
                               stringsAsFactors=FALSE),
                    c("question", "case", "value", "id"))
    res <- res[order(as.numeric(res$question)), ]
    

    结果

    head(res, 18)
    #          question case value id
    # 1.2_1           2    1     5  1
    # 1.2_2           2    2     5  1
    # 1.5_1           5    1     1  1
    # 1.5_2           5    2     2  1
    # 1.6_1           6    1     4  1
    # 1.6_2           6    2     4  1
    # 1.8_1           8    1     5  1
    # 1.8_2           8    2     3  1
    # 1.9_1           9    1     4  1
    # 1.9_2           9    2     4  1
    # 1.10_1         10    1     5  1
    # 1.10_2         10    2     4  1
    # 1.11_1         11    1     5  1
    # 1.11_2         11    2     3  1
    # 1.11_1.1       11  1.1     5  1
    # 1.11_2.1       11  2.1     4  1
    # 1.14_1         14    1     3  1
    # 1.14_2         14    2     2  1
    

    数据

    dat <- structure(list(X = 2L, Q2_1 = 5L, Q2_2 = 5L, Q5_1 = 1L, Q5_2 = 2L, 
        Q6_1 = 4L, Q6_2 = 4L, Q9_1 = 4L, Q9_2 = 4L, Q11_1 = 5L, Q11_2 = 3L, 
        Q8_1 = 5L, Q8_2 = 3L, Q14_1 = 3L, Q14_2 = 2L, Q16_1 = 5L, 
        Q16_2 = 4L, Q10_1 = 5L, Q10_2 = 4L, Q11_1.1 = 5L, Q11_2.1 = 4L, 
        Q19_1 = 5L, Q19_2 = 5L, Q20_1 = 5L, Q20_2 = 5L, Q21_1 = 5L, 
        Q21_2 = 5L, Q15_1 = 5L, Q15_2 = 5L, Q23_1 = 5L, Q23_2 = 4L, 
        Q24_1 = 5L, Q24_2 = 5L, Q25_1 = 5L, Q25_2 = 5L, Q26_1 = 4L, 
        Q26_2 = 5L, Q20_1.1 = 4L, Q20_2.1 = 5L, Q21_1.1 = 4L, Q21_2.1 = 5L, 
        Q29_1 = 5L, Q29_2 = 5L, Q30_1 = 5L, Q30_2 = 5L, Q35_1 = 4L, 
        Q35_2 = 5L, Q36_1 = 5L, Q36_2 = 5L, Q37_1 = 5L, Q37_2 = 5L, 
        Q38_1 = 5L, Q38_2 = 5L, Q39_1 = 5L, Q39_2 = 5L, Q41_1 = 5L, 
        Q41_2 = 5L, Q30_1.1 = 5L, Q30_2.1 = 5L, Q43_1 = 5L, Q43_2 = 5L, 
        Q44_1 = 5L, Q44_2 = 5L, Q45_1 = 5L, Q45_2 = 5L, Q47_1 = 5L, 
        Q47_2 = 5L, Q48_1 = 5L, Q48_2 = 5L, Q36_1.1 = 4L, Q36_2.1 = 5L, 
        Q37_1.1 = 5L, Q37_2.1 = 5L, Q51_1 = 3L, Q51_2 = 2L, Q52_1 = 3L, 
        Q52_2 = 2L, Q53_1 = 3L, Q53_2 = 2L, Q41_1.1 = 3L, Q41_2.1 = 2L, 
        Q42_1 = 3L, Q42_2 = 2L, Q56_1 = 5L, Q56_2 = 5L, Q57_1 = 5L, 
        Q57_2 = 5L, Q58_1 = 5L, Q58_2 = 5L, Q59_1 = 3L, Q59_2 = 2L, 
        Q60_1 = 4L, Q60_2 = 2L, Q61_1 = 3L, Q61_2 = 2L, Q62_1 = 3L, 
        Q62_2 = 2L, Q63_1 = 5L, Q63_2 = 4L, Q64_1 = 5L, Q64_2 = 4L, 
        Q65_1 = 5L, Q65_2 = 5L, Q53_1.1 = 5L, Q53_2.1 = 5L, Q54_1 = 3L, 
        Q54_2 = 2L, Q68_1 = 5L, Q68_2 = 4L, Q75_1 = 4L, Q75_2 = 4L, 
        Q57_1.1 = 4L, Q57_2.1 = 4L, Q58_1.1 = 3L, Q58_2.1 = 2L, Q59_1.1 = 5L, 
        Q59_2.1 = 5L, Q60_1.1 = 5L, Q60_2.1 = 5L, Q61_1.1 = 4L, Q61_2.1 = 3L, 
        Q81_1 = 5L, Q81_2 = 5L, Q82_1 = 5L, Q82_2 = 5L, Q83_1 = 5L, 
        Q83_2 = 5L, Q87_1 = 5L, Q87_2 = 5L, Q88_1 = 5L, Q88_2 = 5L, 
        Q89_1 = 5L, Q89_2 = 5L, Q90_1 = 4L, Q90_2 = 4L, Q91_1 = 5L, 
        Q91_2 = 5L, Q92_1 = 5L, Q92_2 = 5L, Q93_1 = 5L, Q93_2 = 5L, 
        Q94_1 = 5L, Q94_2 = 5L, Q95_1 = 5L, Q95_2 = 5L, Q74_1 = 5L, 
        Q74_2 = 5L, Q75_1.1 = 5L, Q75_2.1 = 5L, Q76_1 = 5L, Q76_2 = 5L, 
        Q77_1 = 5L, Q77_2 = 5L, Q100_1 = 5L, Q100_2 = 5L, Q101_1 = 5L, 
        Q101_2 = 5L, Q102_1 = 5L, Q102_2 = 5L, Q103_1 = 5L, Q103_2 = 5L, 
        Q104_1 = 5L, Q104_2 = 5L, Q105_1 = 5L, Q105_2 = 5L, Q106_1 = 5L, 
        Q106_2 = 5L, Q107_1 = 5L, Q107_2 = 5L, Q108_1 = 5L, Q108_2 = 5L, 
        Q113_1 = 5L, Q113_2 = 5L, Q114_1 = 4L, Q114_2 = 4L, Q117_1 = 5L, 
        Q117_2 = 5L, Q96_1 = 5L, Q96_2 = 5L, Q97_1 = 5L, Q97_2 = 5L, 
        Q98_1 = 5L, Q98_2 = 5L, Q121_1 = 5L, Q121_2 = 5L, Q103_1.1 = 5L, 
        Q103_2.1 = 5L, Q104_1.1 = 5L, Q104_2.1 = 5L, Q127_1 = 4L, 
        Q127_2 = 4L, Q128_1 = 5L, Q128_2 = 5L, Q129_1 = 4L, Q129_2 = 4L), class = "data.frame", row.names = c(NA, 
    -1L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2019-11-18
      • 2019-02-06
      • 2019-12-23
      • 2021-04-26
      • 1970-01-01
      相关资源
      最近更新 更多