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列)
我计划删除 X
和 Y
变量(使用 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
从第 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列)
我计划删除 X
和 Y
变量(使用 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