【问题标题】:Add different suffix to column names on multiple data frames in R在R中的多个数据框上为列名添加不同的后缀
【发布时间】:2020-02-04 20:06:41
【问题描述】:

我正在尝试向我的数据框添加不同的后缀,以便在合并它们后能够区分它们。我将我的数据框放在一个列表中,并为后缀创建了一个向量,但到目前为止我还没有成功。

data2016 是包含我的 7 个数据框的列表

new_names <- c("june2016", "july2016", "aug2016", "sep2016", "oct2016", "nov2016", "dec2016")
data2016v2 <- lapply(data2016, paste(colnames(data2016)), new_names)

【问题讨论】:

  • 您能给我们看一下您的data2016v2-dataframe 的简短版本吗?

标签: r dataframe lapply


【解决方案1】:

您的问题不是很清楚。因此有两种解决方案。 任何一种解决方案的开头都是相同的。假设你有这四个数据框:

df1x <- data.frame(v1 = rnorm(50),
                   v2 = runif(50))
df2x <- data.frame(v3 = rnorm(60),
                   v4 = runif(60))
df3x <- data.frame(v1 = rnorm(50),
                   v2 = runif(50))
df4x <- data.frame(v3 = rnorm(60),
                   v4 = runif(60))

假设您进一步将它们组合成一个列表,类似于您的 data2016,使用 mgetls 并描述匹配它们的模式:

my_list <-  mget(ls(pattern = "^df\\d+x$"))

此列表中数据框的名称如下:

names(my_list)
[1] "df1x" "df2x" "df3x" "df4x"

解决方案 1

假设您想更改数据框的名称:

new_names <- c("june2016", "july2016","aug2016", "sep2016")

然后你可以简单地将new_names分配给names(my_list)

names(my_list) <- new_names

结果是:

names(my_list)
[1] "june2016" "july2016" "aug2016"  "sep2016"

解决方案 2

您想添加 new_names literally 作为“旧”名称的后缀,在这种情况下,您将使用 pastepaste0,因此:

names(my_list) <- paste0(names(my_list), "_", new_names)

结果是:

names(my_list)
[1] "df1x_june2016" "df2x_july2016" "df3x_aug2016"  "df4x_sep2016" 

【讨论】:

  • 可以指定data2016v2 &lt;- Map(function(dat, y) setNames(dat, paste0(names(dat), y)), data2016, new_names)
  • @akrun 提供但后来撤回的另一个解决方案是:data2016v2 &lt;- Map(function(dat, y) setNames(dat, paste0(names(dat), y)), data2016, new_names)
  • 我想你现在会承认 OP 想要什么
【解决方案2】:

您可以使用lapply 中的索引号来引用列表和后缀向量。因为有几个步骤,我将把这个过程包装在function() 中。 (称为匿名函数,因为我们没有为其指定名称。)

data2016v2 <- lapply(1:7, function(i) {
  this_data <- data2016[[i]] # Double brackets for a list
  names(this_data) <- paste0(names(this_data), new_names[i]) # Single bracket for vector
  this_data # The renamed data frame to be placed into data2016v2
})

注意paste0() 行我们正在回收new_names[i] 中的术语,例如,如果new_names[i]"june2016" 并且您的第一个data.frame 具有列"A""B" 和@987654331 @ 然后它会给你这个:

> paste0(c("A", "B", "C"), "june2016")
[1] "Ajune2016" "Bjune2016" "Cjune2016"

(您可能想在其中添加下划线?)

顺便说一句,听起来您最好将"june2016" 添加为数据中的一列(例如一个名为month 的变量,"june2016" 作为每一行中的值)并结合您的使用 dplyr 包中的 bind_rows() 之类的数据,将其“长”而不是“宽”运行。

【讨论】:

  • 感谢您的解释。这正是我一直在寻找的。我现在遇到的问题是data2016v3 &lt;- Reduce(function(x, y) merge(x, y, by = "Employee ID", all = TRUE), data2016v2) 将不再起作用,因为我的合并列不同,但我会尝试解决这个问题。再次感谢!!
  • 可能类似于names(this_data)[-1] &lt;- paste0(names(this_data)[-1], new_names[i])?如果您的 ID 在第一列,那就是。
猜你喜欢
  • 2020-11-24
  • 2021-07-28
  • 2021-11-10
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多