交换R中的多列
Swap multiple column in R
假设我有一个数据框
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
结尾的变量中的值 so 列。例如,交换 X1_C2
和 X1_C3
、X2_C2
和 X2_C3
以及类似的 Xs
in C2
和 C3
感谢任何帮助
如何更改列名称?
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])
如果你想交换列(不仅仅是名字),你可以试试下面的代码
> 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
一种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
假设我有一个数据框
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
结尾的变量中的值 so 列。例如,交换 X1_C2
和 X1_C3
、X2_C2
和 X2_C3
以及类似的 Xs
in C2
和 C3
感谢任何帮助
如何更改列名称?
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])
如果你想交换列(不仅仅是名字),你可以试试下面的代码
> 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
一种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