我有一个类似如下的数据帧:(实际上,for循环中有16个数据帧)
head(data)
# A tibble: 1 x 4
AAA AAC AB AC
1 18 25 39 9
2 20 25 30 7
我希望根据列的原始名称动态更改所有列名,如下所示(我try 使用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文件的列表,每个.txt文件分别称为"xxxxxxxxxxx_xx_50.txt"、"xxxxxxxxxx_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))
}
}