在R中遍历一组数据框

3
假设我有一组数据框: df1, df2, d3, df4。我想对每个数据框应用某种行为。为了避免重复编写代码,我想通过某种for循环来实现。例如,假设我想获取df并重新分配它,以便第一列成为行名称。我通常会这样做:
df1_b <- df1[,-1]
rownames(df1_b) <- df1[,1]

我该如何对我所拥有的所有四个数据帧进行此操作?我想我需要将这些数据帧合并成一个set,然后执行类似以下的操作:
for (i in set) {
  i+"_b" <- i[,-1]
  rownames(i_b) <- i[,1]
}

我试着用cbind来做这件事:

df_set <- c(df1, df2, df3, df4)
for (i in df_set) {
  i+"_b" <- i[,-1]
  rownames(i_b) <- i[,1]
}

当然,这不起作用(我很确定R不能像这样进行字符串连接)。

任何帮助都将不胜感激!


1
你说得对,R不会像那样进行连接,但是你可以使用paste(i, "b", sep = "_")。但最好还是创建一个数据框列表,并使用lapplypurrr::map进行迭代。已经有很多关于这方面的SO帖子了。 - camille
2个回答

3
我们可以使用mget函数将多个对象的值获取到一个list中,然后通过使用lapply函数对list进行循环处理。请注意保留HTML标记。
lst1 <- lapply(mget(paste0("df", 1:4)), function(x) {
               row.names(x) <- x[,1]
                x[,-1]
    })

如果我们想要更改原始对象(不推荐)

list2env(lst1, .GlobalEnv)

另一个选择是tidyverse

library(purrr)
library(tibble)
library(dplyr)
mget(ls(pattern = "^df\\d+$")) %>%
     map(~ .x %>%
               column_to_rownames(names(.)[1])) 

谢谢这个。我实际上很喜欢tidyverse的解决方案。使用它,你必须在R中使用map而不是for循环吗?我想这并不重要。 - BOBjwjwj3j3j
1
@BOBjwjwj3j3j for循环同样适用。我不喜欢创建多个对象,因此希望将其保留在一个list中。 - akrun
非常好。最后一个问题:在这种情况下,columns_to_rownames解决方案返回“无法在.data中找到列1。”我认为这是因为第一列的第一个单元格是一个字符字符串(每个df之间不同)。有没有办法指定索引[,1]中的内容? - BOBjwjwj3j3j
1
@BOBjwjwj3j3j 抱歉,应该是 column_to_rownames(names(.)[1]) - akrun

2
您可以像这样应用一个函数,例如:
# getting some dummy data
df1 <- mtcars
df2 <- mtcars
df3 <- mtcars
df4 <- mtcars

lst <- list(df1, df2, df3, df4)

# example of applying the function row.names to the data
Map(row.names, lst)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接