首页 > 解决方案 > 在R中按天重命名数据框的列

问题描述

我需要在分析中按天重命名数据框。

names(dados) <- c("name", "day_1","Freq_1","Percent_1","day_2","Freq_2","Percent_2",
                  "day_3","Freq_3","Percent_3","day_4","Freq_4","Percent_4",
                  "day_5","Freq_5","Percent_5","day_6","Freq_6","Percent_6",
                  "day_7","Freq_7","Percent_7","day_8","Freq_8","Percent_8",
                  "day_9","Freq_9","Percent_9")

我正在分析我得到的数据位于数据框列表中,其中每个数据框代表一天的分析。我合并了数据框,我将每个数据框的“name”列和“day_X”、“Freq_X”和“Percent_X”列作为返回。

作为回报,我需要列具有以下名称:

"姓名","day_1","Freq_1","Percent_1","day_2","Freq_2","Percent_2","day_3","Freq_3","Percent_3"

如何分析 50 天?

可重现的例子:

day1 <- data.frame(name = c("jose", "mary", "julia"), freq = c(1,5,3), percent = c(40,30,20))
day2 <- data.frame(name = c("abner", "jose", "mary"), freq = c(3,5,4), percent = c(20,30,20))
day3 <- data.frame(name = c("abner", "jose", "mike"), freq = c(6,2,3), percent = c(40,30,70))
day4 <- data.frame(name = c("andre", "joseph", "ana"), freq = c(1,5,8), percent = c(40,30,20))
day5 <- data.frame(name = c("abner", "poli", "joseph"), freq = c(4,3,3), percent = c(10,30,10))

dates <- list(day1,day2,day4,day5)

data <- Reduce(function(x, y) merge(x, y, by = "name", all = TRUE), dates)

标签: rdataframe

解决方案


这是一种使用tidyverse软件包套件获得所需内容的方法。我们首先将数据放入“长”格式 - 但添加一个带有日期的列:

long_form <- dates %>%
  imap_dfr(function(x, y) dplyr::mutate(x, day_num = y))

现在,为了获得您所追求的宽格式,我们需要重新格式化一些东西,如下面的代码所示。day_#正如@user在评论中提到的那样,我不确定变量中应该包含什么,所以它丢失了。如果您有一个名为 的变量day,则代码应自动执行所写的正确操作。

wide_form <- long_form  %>%
  gather(key, value, -name,-day_num) %>%
  dplyr::mutate(
    key = paste(key, day_num, sep = "_")
  ) %>%
  select(-day_num) %>%
  spread(key, value)

推荐阅读