R中带有for循环的多个数据帧上的行名

Posted

技术标签:

【中文标题】R中带有for循环的多个数据帧上的行名【英文标题】:rownames on multiple dataframe with for loop in R 【发布时间】:2022-01-16 01:55:27 【问题描述】:

我有几个数据框。我希望第一列是每一行的名称。

我可以这样处理 1 个数据帧:

# Rename the row according the value in the 1st column
row.names(df1) <- df1[,1]

# Remove the 1st column
df1 <- df1[,-1]

但我想在几个数据帧上这样做。我尝试了几种策略,包括分配和一些获取,但没有成功。这是我尝试过的两种主要方法:

# Getting a list of all my dataframes
my_df <- list.files(path="data")

# 1st strategy, adapting what works for 1 dataframe
for (i in 1:length(files_names)) 
  rownames(get(my_df[i])) <- get(my_df[[i]])[,1] # The problem seems to be in this line
  my_df[i] <- my_df[i][,-1]


# The error is  Could not find function 'get>-'

# 2nd strategy using assign()
for (i in 1:length(my_df)) 
  assign(rownames(get(my_df[[i]])), get(my_df[[i]])[,1]) # The problem seems to be in this line
  my_df[i] <- my_df[i][,-1]


# The error is : Error in assign(rownames(my_df[i]), get(my_df[[i]])[, 1]) : first argument incorrect

我真的看不出我错过了什么。当我输入get(my_df[i])get(my_df[[i]])[,1] 时,它在控制台中单独运行...

非常感谢那些可以帮助我的人:)

【问题讨论】:

【参考方案1】:

我们可以使用lapplypurrr::map这样的循环函数来循环所有的data.frames,然后使用dplyr::column_to_rownames,这大大简化了过程。不需要显式的 for 循环。

library(purrr)
library(dplyr)

map(my_df, ~ .x %>% read.csv() %>% column_to_rownames(var = names(.)[1]))

【讨论】:

【参考方案2】:

您可以编写函数中的代码,读取数据并将每个数据帧传递给函数。

change_rownames <- function(df1) 
  row.names(df1) <- df1[,1]
  df1 <- df1[,-1]
  df1  


my_df <- list.files(path="data")

list_data <- lapply(my_df, function(x) change_rownames(read.csv(x)))

【讨论】:

您好,谢谢您的回答。我想到了一个功能,但它不起作用。正如你所写的那样,我这样做了(只需使用 read.table 而不是 read.csv,但即使你写它也不起作用)\n change_rownames &lt;- function(df) row.names(df) &lt;- df[,1] df &lt;- df[,-1] df list_data &lt;- lapply(files_names, function(x) change_rownames(read.table(x, header = F, sep = "\t")))

以上是关于R中带有for循环的多个数据帧上的行名的主要内容,如果未能解决你的问题,请参考以下文章

基于条件更改行值的 Python for 循环可以正常工作,但不会更改 pandas 数据帧上的值?

在R中没有for循环的行之间移动值

thinkphp 对循环输出的数据进行求和计算

在 R 中使用 for 循环绘制多个图

SQL 游标 FOR 循环,模式名称中带有 / 变量

Javascript中带有For循环的innerHTML