我有一个类似如下的数据帧:(实际上,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相关问答推荐

在连续尺度上转置标签[瀑布图,R]

条形图和在Ploly中悬停的问题

对于变量的每个值,仅 Select 包含列表中所有值的值.R

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

使用rvest从多个页面抓取时避免404错误

有没有可能用shiny 的书签恢复手风琴面板?

R中的类别比较

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

删除字符串R中的重复项

按组跨多列创建伪变量

如何合并不同列表中的数据文件,包括基于名称的部分匹配,而不是一对一等价

以R表示的NaN值的IS.NA状态

臭虫?GradeThis::grade_this_code()在`-code-check`块中失败

如何在类应用函数中访问函数本身

如何阅读带有方括号的文件?

当执行一个比下游react 链慢的耗时的函数时,如何防止shiny 的react 对象反弹?

在R中创建用户定义的相关矩阵

如何使图例(Gggraph)中的点和线具有不同的 colored颜色

长而宽的格式练习