【问题标题】:How to rename all columns in a dataframe to include the name of the data for all dataframes in a list?如何重命名数据框中的所有列以包含列表中所有数据框的数据名称?
【发布时间】:2015-12-29 05:41:17
【问题描述】:

我有一个数据框列表listofdfs。要重命名列表中 singledf 的数据框之一的列,可以使用以下代码:

colnames(listofdfs[["singledf"]]) <- paste(colnames(listofdfs[["singledf"]]), "singledf")

瞄准

要重命名数据框列表中所有数据框的所有列,listofdfs,以在所有相应的列名称中包含数据框的名称。

尝试 1

for (i in listofdfs){
        colnames(listofdfs[i]) <- paste(colnames(listofdfs[i]), i)
}

出现此错误

Error in `*tmp*`[i] : invalid subscript type 'list'

尝试 2

for (i in listofdfs){
        newnames <- paste(colnames(listofdfs[i]), i)
        colnames(bsl) <- newnames
}

出现此错误

没有打印错误,但是当我检查数据框的列之一时,列名保持不变。

尝试 3

for (i in listofdfs){
        colnames(listofdfs[[i]]) <- paste(colnames(listofdfs[[i]]), i)
}

出现此错误

Error in listofdfs[[i]] : invalid subscript type 'list'

【问题讨论】:

  • 你在开头清楚地表明你使用了listofdfs[["singledf"]](注意[[),然后你尝试使用listofdfs[i](单个[)。
  • 是的 - 我也收到一个错误...将更新问题。
  • 你能在你的问题中添加一些数据吗

标签: r for-loop rename


【解决方案1】:

以下代码重命名列表中每个 data.frame 的列名,以便将 data.frames 的名称添加到原始列名中。

# example data
a <- data.frame(col1 = 1:10, col2 = 10:1)
b <- data.frame(col_01 = 11:20, col_02 = 20:11)

# list of data.frames
list_of_df <- list(a, b)

# names of data.frames
names(list_of_df) <- c("a", "b")

# my sequence and names of data.frames in a list
my_seq <- seq_along(list_of_df)
my_list_names <- names(list_of_df)

# procedure
for (i in my_seq) {

  names(list_of_df[[my_seq[i]]]) <- 
    paste(my_list_names[i], names(list_of_df[[my_seq[i]]]), sep = "_")

}

list_of_df

$a
   a_col1 a_col2
1       1     10
2       2      9
3       3      8
4       4      7
5       5      6
6       6      5
7       7      4
8       8      3
9       9      2
10     10      1

$b
   b_col_01 b_col_02
1        11       20
2        12       19
3        13       18
4        14       17
5        15       16
6        16       15
7        17       14
8        18       13
9        19       12
10       20       11

【讨论】:

    【解决方案2】:

    你快到了。做这样的事情

    for (i in seq_along(listofdfs)){
        colnames(listofdfs[[i]]) <- paste(colnames(listofdfs[[i]]), i)
    }
    

    这应该执行您创建列名的逻辑而不会出现任何错误。

    为什么

    for (i in listofdfs){
            colnames(listofdfs[[i]]) <- paste(colnames(listofdfs[[i]]), i)
    }
    

    因为您期望i 是一个索引,但它本身就是一个data.frame。使用print调试

    for (i in listofdfs){
        print(class(i))
    }
    

    这就是你得到的

    [1] "data.frame"
    [1] "data.frame"
    

    您不能使用data.frame 下标。 R 中带有in 运算符的forloop 沿着单个元素而不是它们的索引进行迭代。因此我们必须使用seq_along

    希望这会有所帮助。

    【讨论】:

    • 感谢seq_along 的建议。它接近了,它为每个数据帧的列打印迭代器的索引号。
    【解决方案3】:

    考虑一个具有 5 列的 Dataframe df,例如:- col1,col2,col3,col4,col5 并且您需要将它们重命名为 姓名、年龄、出生日期、城市、国家

    您可以使用简单的方法来做到这一点

    val renamedColumns=df.toDF("name","age","DOB","city","country")
    

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 2018-01-04
      • 1970-01-01
      • 2021-11-15
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多