我有一个与此类似的数据框:(事实上,for 循环中有 16 个)
head(data)
# A tibble: 1 x 4
AAA AAC AB AC
1 18 25 39 9
2 20 25 30 7
我想根据列的原始名称动态更改所有列名称,如下所示(我尝试过str_glue
,但我收到错误):
### I have a for-loop: (NOT WORKING) (this is a part of the loop)
assign(str_glue("df_{str_sub(data[i], 23, - 5)}"),
read.delim(data[i], sep = ",", header = T) %>%
mutate(ID = Participants,
str_glue("New_{str_sub(data[i], 23, - 5)}_AAA") = AAA,
str_glue("New_{str_sub(data[i], 23, - 5)}_AAB") = AAC,
str_glue("New_{str_sub(data[i], 23, - 5)}_AB") = AB,
str_glue("New_{str_sub(data[i], 23, - 5)}_AC") = AC)
期望的输出:
### Note:
### depending on the index-i,
### str_glue("New_{str_sub(data[i], 23, - 5)}_AAA") will get me either 50,100 or 150
### desired output for i = 1
New_50_AAA New_50_AAC New_50_AB New_50_AC
1 18 25 39 9
2 20 25 30 7
我确信有一种优雅的方法可以做到这一点。我看过一些相关的帖子,但似乎没有一个对我有帮助。有任何想法吗?谢谢 :)
PS:如果还有一种方法可以动态重复原始列的名称而不用 str_ 重复它,那将是完美的,它会节省我 4 行
EDIT
整个循环如下所示:
“data”是 16 个 .txt 文件的列表,每个文件名为“xxxxxxxxx_xx_50.txt”、“xxxxxxxxx_xx_100.txt”(依此类推)
for (i in 1:length(data)) {
if (grepl("xxxxxxxxx_x1_.txt$", data[i])) {
assign(str_glue("df_narr{str_sub(data[i], 23, - 5)}"),
read.delim(data[i], sep = ",", header = T) %>%
mutate(ID = Participants,
str_glue("New_1{str_sub(data[i], 23, - 5)}_AAA") = AAA,
str_glue("New_1{str_sub(data[i], 23, - 5)}_AAB") = AAC,
str_glue("New_1{str_sub(data[i], 23, - 5)}_AB") = AB,
str_glue("New_1{str_sub(data[i], 23, - 5)}_AC") = AC) %>%
mutate_if(is.numeric, round, digits = 2))
} else if (grepl("xxxxxxxxx_x2_.txt$", data[i])) {
assign(str_glue("df_narr{str_sub(data[i], 23, - 5)}"),
read.delim(data[i], sep = ",", header = T) %>%
mutate(ID = Participants,
str_glue("New_2{str_sub(data[i], 23, - 5)}_AAA") = AAA,
str_glue("New_2{str_sub(data[i], 23, - 5)}_AAB") = AAC,
str_glue("New_2{str_sub(data[i], 23, - 5)}_AB") = AB,
str_glue("New_2{str_sub(data[i], 23, - 5)}_AC") = AC) %>%
mutate_if(is.numeric, round, digits = 2))
}
}