更改多个列名称,粘贴在列名称的开头/结尾

时间:2019-11-29 16:51:37

标签: r multiple-columns

我有一个非常简单的问题,但是我有点挣扎,因为我不擅长字符串操作, 我有一个看起来像这样的数据集

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = rnorm(9), x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))
df
#    id  time    y         x1      x2     c2
# 1  1    1  0.2849573 -2.0675484  0  -0.07262881
# 2  1    2  0.7790181 -0.7575962  0  -0.58792408
# 3  1    3  1.5612293  0.6249859  0   1.19410761
# 4  2    1  0.5001897  3.4156129  0  -0.03577452
# 5  2    2  0.7155184 -0.5672982  1  -1.22208675
# 6  2    3  0.5086272 -0.7848763  0  -0.41084467
# 7  3    1 -0.4707959  0.1159467  1   0.77233201
# 8  3    2  0.8641184  0.2498162  1   0.49336869
# 9  3    3  1.3348043 -0.6803672  1  -0.33189217

我只想更改从x1开始的所有列名,并添加一个“ _0”。最终数据集应如下所示。

final
#   id   time     y       x1_o     x2_o    c2_o
# 1  1    1  1.1251762 -0.7191008    0  -0.07478527
# 2  1    2  0.7585758  1.8694635    0  -0.42652822
# 3  1    3 -1.3180201 -0.4336776    0   0.38417779
# 4  2    1  1.7335904  2.2968254    0  -0.35639828
# 5  2    2  0.1506950 -0.5481873    1  -0.38523601
# 6  2    3 -1.9475207 -0.5302951    0   0.21721675
# 7  3    1 -0.1024133 -0.2872962    1  -0.06347213
# 8  3    2  0.1316069  0.1463118    1  -0.19518602
# 9  3    3 -1.1037682 -0.1129085    1  -0.24011278

我能够一一更改列名,但是我想找到一个单行命令。 我已经尝试过了,但是只能在开始时粘贴。

dp_o<-df %>% rename_at(3:5, ~paste("_o",.))

可能只是上面代码的一种变体,但是鉴于我对字符串操作的理解不佳,我很难理解哪种变体

预先感谢

3 个答案:

答案 0 :(得分:1)

如果您不介意使用interface Msg class HelloMsg: Msg class ByeMsg: Msg class Hold<T: Msg>(val msg: T) fun test(): Hold<Msg> { val m1 = Hold(HelloMsg()) val m2 = Hold(ByeMsg()) return if(true) m1 else m2 //DOESN'T COMPILE return if(true) Hold(HelloMsg()) else Hold(ByeMsg()) //COMPILES } 软件包,则可以执行以下操作

data.table

答案 1 :(得分:1)

我们需要在末尾_o,因为paste是根据从左到右而不是相反的参数进行连接的

library(dplyr)
df %>%
    rename_at(3:5, ~ paste0(., "_o"))
#   id time         y_o        x1_o x2_o         c2
#1  1    1  0.62714872 -0.70259726    0  0.4386072
#2  1    2 -0.53052052 -0.37854004    0  1.8857944
#3  1    3 -0.97729791  0.70909984    0  0.3611839
#4  2    1 -0.31016711 -1.12787900    0  0.9684549
#5  2    2 -1.91335148 -1.84690443    1 -0.1196826
#6  2    3 -0.03967186  0.21916880    0  0.6295054
#7  3    1  1.18847857 -0.75449457    1 -1.4622606
#8  3    2  0.81352527 -0.44126036    1  0.8604688
#9  3    3  1.92443154 -0.04599181    1 -0.9240210

或者如果我们需要匹配列名

df %>%
   rename_at(vars(match('x1', names(.)):ncol(.)), ~ paste0(., '_o'))

或与str_c

library(stringr)
df %>%
    rename_at(vars(x1:c2), ~ str_c(., '_o'))

答案 2 :(得分:1)

使用base R,也许可以通过以下代码来实现:

names(df)[-(1:3)] <- paste0(names(df)[-(1:3)],"_o")

给出:

> df
  id time          y        x1_o x2_o       c2_o
1  1    1 -1.1861828 -0.97027842    0  1.8556257
2  1    2  1.1964478  0.48936940    0 -0.2144602
3  1    3 -1.1164802  0.03258791    0 -1.7737551
4  2    1  0.4940969 -1.31300219    0  0.1865097
5  2    2 -0.8735071 -1.01195060    1  0.6515702
6  2    3  0.1749421  0.27409115    0 -1.2432389
7  3    1  1.8849013  0.92642054    1  0.9861089
8  3    2 -0.3765072 -1.15343868    1  0.8451167
9  3    3 -0.2033892  1.66717960    1 -0.1480590