【问题标题】:Swap multiple column in R在R中交换多列
【发布时间】:2021-05-26 06:11:21
【问题描述】:

假设我有一个数据框

data=data.frame(X1_C1=c(1:5),
                X2_C1=c(11:15),
                X3_C1=c(111:115),
                X1_C2=c(2:6),
                X2_C2=c(21:25),
                X3_C2=c(211:215),
                X1_C3=c(3:7),
                X2_C3=c(31:35),
                X3_C3=c(311:315))


> data
  X1_C1 X2_C1 X3_C1 X1_C2 X2_C2 X3_C2 X1_C3 X2_C3 X3_C3
1     1    11   111     2    21   211     3    31   311
2     2    12   112     3    22   212     4    32   312
3     3    13   113     4    23   213     5    33   313
4     4    14   114     5    24   214     6    34   314
5     5    15   115     6    25   215     7    35   315

我想交换以_C2_C3 结尾的变量列中的值。例如,将X1_C2X1_C3X2_C2X2_C3C2C3 中的其他Xs 交换类似

任何帮助表示赞赏

【问题讨论】:

    标签: r multiple-columns swap


    【解决方案1】:

    如果你想交换列(不仅仅是名称),你可以试试下面的代码

    > data[c(matrix(names(data), 3)[, c(1, 3, 2)])]
      X1_C1 X2_C1 X3_C1 X1_C3 X2_C3 X3_C3 X1_C2 X2_C2 X3_C2
    1     1    11   111     3    31   311     2    21   211
    2     2    12   112     4    32   312     3    22   212
    3     3    13   113     5    33   313     4    23   213
    4     4    14   114     6    34   314     5    24   214
    5     5    15   115     7    35   315     6    25   215
    

    如果你想交换名字

    > setNames(data, c(matrix(names(data), 3)[, c(1, 3, 2)]))
      X1_C1 X2_C1 X3_C1 X1_C3 X2_C3 X3_C3 X1_C2 X2_C2 X3_C2
    1     1    11   111     2    21   211     3    31   311
    2     2    12   112     3    22   212     4    32   312
    3     3    13   113     4    23   213     5    33   313
    4     4    14   114     5    24   214     6    34   314
    5     5    15   115     6    25   215     7    35   315
    

    【讨论】:

    • 如果我只想交换值而不是列名怎么办?
    • @Uddin 是什么意思?如果您不想更改列名,只需对列进行简单的重新排序即可。 TIC一如既往的惊人答案,已经投票了
    【解决方案2】:

    dplyr 方法,不如 TIC 建议的那么好,但如果它可能有帮助的话

    data %>%
      rename_with(~str_replace(., '_C2', '_CC3'), ends_with('_C2')) %>%
      rename_with(~str_replace(., '_C3', '_C2'), ends_with('_C3')) %>%
      rename_with(~str_replace(., '_CC3', '_C3'), ends_with('_CC3'))
    
      X1_C1 X2_C1 X3_C1 X1_C3 X2_C3 X3_C3 X1_C2 X2_C2 X3_C2
    1     1    11   111     2    21   211     3    31   311
    2     2    12   112     3    22   212     4    32   312
    3     3    13   113     4    23   213     5    33   313
    4     4    14   114     5    24   214     6    34   314
    5     5    15   115     6    25   215     7    35   315
    

    【讨论】:

      【解决方案3】:

      如何更改列名?

      tmp1=grepl("_C2",colnames(data))
      tmp2=grepl("_C3",colnames(data))
      
      colnames(data)[tmp1]=gsub("_C2","_C3",colnames(data)[tmp1])
      colnames(data)[tmp2]=gsub("_C3","_C2",colnames(data)[tmp2])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多