/**/

我有一个类似如下的数据帧:(实际上,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)) 
  }
}

推荐答案

最好将数据集保留在list中并重命名它们-获取包含list.files的文件夹中的文件,然后从文件(‘nm1’)中提取.txt之前的数字(\\d+-一个或多个数字),循环遍历文件和在Map中提取的名称,读取数据并通过使用‘New_’、相应的数字(‘nm’)和原始列名paste来修改列名

files <- list.files(path = 'path/to/your/folder', pattern = "\\.txt$", 
     full.names = TRUE)
nm1 <- sub(".*_(\\d+)\\.txt", "\\1", basename(files))
lst1 <- Map(\(x, nm) {

        tmp <- read.table(x) 
        num_cols <- sapply(tmp, is.numeric)
        tmp[num_cols] <- lapply(tmp[num_cols], round, digits = 2)
        cols_to_rename <- names(tmp) != "Participants"
         names(tmp)[cols_to_rename] <- paste0("New_", nm, "_", 
               names(tmp)[cols_to_rename])
         names(tmp)[!cols_to_rename] <- "ID"
        tmp
    }, files, nm1)

或使用tidyverse

library(dplyr)
library(readr)
library(purrr)
library(stringr)
lst2 <- imap(setNames(files, nm1), ~ {
      nm <- .y
      read_table(.x) %>%
       rename_with(~ str_c("New_", nm, "_", .x), -Participants) %>%
      mutate(across(where(is.numeric), round, digits = 2)) %>%
      rename(ID = Participants)
    })

或在for个循环中

# for storing the output from the `for` loop
lst3 <- vector('list', length(files))
# loop over the sequence of files
for(i in seq_along(files)) {
   tmp <- read.table(files[i])
   cols_to_rename <- names(tmp) != "Participants"
    names(tmp)[cols_to_rename] <- paste0("New_", nm1[i], "_", 
               names(tmp)[cols_to_rename]) 
    names(tmp)[!cols_to_rename] <- "ID"
   num_cols <- sapply(tmp, is.numeric)
   tmp[num_cols] <- lapply(tmp[num_cols], round, digits = 2)
   lst3[[i]] <- tmp
  }

R相关问答推荐

将向量添加到列,而不指定其他列

不要转义 Rmarkdown 文件中的特殊字符

相对于每组条件行计算每 n 行的斜率

如何从 R 中的其他组中减go 一个组

使用 dplyr 将数据框中的值(基于特定分组)乘以单独的矩阵

try 从数据框列中的向量替换值时如何避免回收

如何同时洗牌 data.frame 的两列?

带有中值标签的箱线图和下面的 n 表

来自矩阵的 Spearman 相关性

在 R dplyr 中,仅保留特定先前值的值

逐行交替组合矩阵

使每一列成为每组值的行

根据条件 tidyverse 求和 Select 行

在数据框中合并和分组列以创建汇总列的有效方法

如何将数据框中的所有数字字符串转换为 R 中的数字?

使用 R,strsplit 如何在字符串末尾使用拆分器处理固定元素进行拆分?

如何删除向量中的未知空格?

dplyr 条件过滤组

我可以防止 summary.coxph 截断系数名称吗

如何根据R中另一列的值填写空白