R:通过从一致的相对位置复制和扩展其他变量名称来重命名重复变量

R: Rename duplicate variables by replicating and extending other variable names from a consistent relative position

从第 14 列开始,我每 4 列有重复的 Z 个变量(大约 25 次):

... Apple  X  Y **Z** Car  X  Y **Z** Hike  X  Y **Z** Door  X  Y **Z**...
... 14     25 64  26  14   37 35  13  35    75 23  12  58    32 72  36 ...
... 35     14 75  23  14   64 87  64  42    21 35  75  34    24 63  34 ...

(此处,Apple为第11列)

我计划删除 XY 变量(使用 df[!duplicated(colnames(df)]),但要这样做(并且能够使用 Z 变量) ,我的理解是 Z 变量不能重复。

我想重命名 Z 个变量,以便它们从后面 3 列的变量中获取名称,后跟“_RT”。因此,例如,table 中的第一个 Z 将变为 Apple_RT,第二个 Z 将变为 Car_RT,依此类推。

重命名 Z 变量并删除 X 和 Y 变量后,数据应如下所示(加上未更改的前 10 个变量):

... Apple  Apple_RT Car  Car_RT Hike  Hike_RT Door  Door_RT ...
... 14     26       14   13     35    12      58    36      ...
... 35     23       14   64     42    75      34    34      ...

data 示例数据稍微改了一下,原理是一样的。从这里开始是 3,这是第一个“类别”Apple

df <- structure(list(A = 1, B = 2, APPLE = 3, X = 4, Y = 5, Z = 6, CAR = 7, X = 8, Y = 9, Z = 10, HIKE = 7, X = 8, Y = 9, Z = 10), class = "data.frame", row.names = c(NA,-1L))

#   A B APPLE X Y Z CAR X Y  Z HIKE X Y  Z
# 1 1 2     3 4 5 6   7 8 9 10    7 8 9 10

解决方案

start = 3

v <- names(df)
keep <- v[1:(start-1)]
cats <- v[start:length(v)]
cats <- cats[!cats %in% cats[duplicated(cats)]]


out <- df[!names(df) %in% c("X", "Y")]
names(out) <- c(keep, unlist(lapply(cats, function(x) c(x, paste0(x, "_RT")))))

输出

out

#   A B APPLE APPLE_RT CAR CAR_RT HIKE HIKE_RT
# 1 1 2     3        6   7     10    7      10