The Wide and Long Data Format for Repeated Measures Data

https://www.theanalysisfactor.com/wide-and-long-data/

The Wide and Long Data Format for Repeated Measures Data

by KAREN GRACE-MARTIN

One issue in data analysis that feels like it should be obvious, but often isn’t, is setting up your data.

The kinds of issues involved include:

  • What is a variable?
  • What is a unit of observation?
  • Which data should go in each row of the data matrix?

Answering these practical questions is one of those skills that comes with experience, especially in complicated data sets.

Even so, it’s extremely important. If the data isn’t set up right, the software won’t be able to run any of your analyses.

And in many data situations, you will need to set up the data different ways for different parts of the analyses. This article will outline one of the issues in data set up: using the long vs. the wide data format.

The Wide Format

In the wide format, a subject’s repeated responses will be in a single row, and each response is in a separate column.

For example, in this data set, each county was measured at four time points, once every 10 years starting in 1970. The outcome variable is Jobs, and indicates the number of jobs in each county. There are three predictor variables: Land Area, Natural Amenity (4=no and 3=Yes), and the proportion of the county population in that year that had graduated from college.

Since land area and presence of a natural amenity doesn’t change from decade to decade, those predictors have only one variable per county. But both our outcome, Jobs, and one predictor, College, have different values in each year, so require a different variable (column) for each year.

(click to see larger)

The Long Format

In the long format, each row is one time point per subject. So each subject (county) will have data in multiple rows. Any variables that don’t change across time will have the same value in all the rows.

You can see the same five counties’ data below in the long format. Each county has four rows of data–one for each year.

All the same information is there; we’re just set up the data differently.

We no longer need four columns for either Jobs or College. Instead, all four values of Jobs for each county are stacked–they’re all in the Jobs column. The same is true for the four values of College.

But to keep track of which observation occurred in which year, we need to add a variable, Year.

You’ll notice that variables that didn’t change from year to year–Land Area and Natural Amenity–have the same value in each of the four rows for each county. It looks strange, but it’s okay to have it this way, and as long as you analyze the data using the correct procedures, it will take into account that these are redundant.

image002

 

A Comparison of the Two Approaches

One reason for setting up the data in one format or the other is simply that different analyses require different set ups.

For example, in all software that I know of, the wide format is required for MANOVA and repeated measures procedures.

Many data manipulations are much, much easier as well when data are in the wide format.

Likewise, mixed models and many survival analysis procedures require data to be in the long format.

Beyond software requirements, each approach has analytical implications. For example, in the wide format, the unit of analysis is the subject–the county–whereas in the long format, the unit of analysis is each measurement occasion for each county.

The practical difference is that when the occasion is the unit of analysis, you can use each decade’s college education rate as a covariate for the same decade’s Jobs value. In the wide-format, when the unit of observation is the county, there is no way to do this. You can use any of the college rates as covariates for all years, but you can’t have decade-specific covariates.

Another implication is that in the wide format, those repeated outcomes are considered different and non-interchangeable variables. Each can have its own distribution. Each is distinct. This makes sense in the county example where each observation occurred in the same four years for every county. But if each county had been measured a different number of times, or measured in different years, this set up doesn’t make a lot of sense.

So it’s important to think about the implications before you enter data.

Luckily, converting from one to the other is generally not too difficult in most software packages. For example, you can do it with Proc Transpose in SAS or with the Restructure wizard in SPSS.

This is a good skill to practice, as it’s quite helpful to be able to switch back and forth. For example, it’s often easier to enter and manipulate data in the wide format, even if you need to analyze it in the long format.

在前序问题中,我们已经基于理论模型,设计并优化出了特定模式的 光谱。然而,理论设计需要通过人体实验来验证。本问题将提供一组临床睡眠 实验数据,要求运用统计分析方法,评估我们设计的“优化光照”是否真正对 改善人类睡眠质量有显著效果。这是一项包含 11 位健康被试的交叉实验。每位 被试在不同日期分别体验了以下三种睡前光照环境,每种环境持续一晚: 环境 A 被试在睡前 2 小时暴露于问题二中设计的“夜间助 眠模式”的光谱下。 环境 B 被试在睡前 2 小时暴露于一种普通的市售 LED 灯 光下。 环境 C 被试在睡前 2 小时处于严格的黑暗环境中。 现提供这 11 位被试在三种环境下(共 11×3=33 条有效记录)的整夜睡眠数 据,数据详见附录数据文件“Problem 4”。数据由便携式睡眠监测仪采集,每 30 秒记录一次。数据中的睡眠阶段编码遵循美国睡眠医学会(AASM)的标准: 4 清醒 (Wake) 5 REM 睡眠 (Rapid Eye Movement) 2 N2 期睡眠 (Stage N2)+ N1 期睡眠 (Stage N1) 3 N3 期睡眠 (Stage N3, 即深睡眠/慢波睡眠) 通常,N1 期和 N2 期被合称为“浅睡眠”(Light Sleep)。 根据睡眠医学的常用标准,我们为每个被试的每次实验计算以下关键指标: 总睡眠时间 (Total Sleep Time, TST) 记录中所有非清醒阶段(N1, N2, N3, REM)的总时 长。 睡眠效率 (Sleep Efficiency, SE) SE = (TST / 总卧床时间) × 100%。总卧床时间指从关 灯入睡到最终醒来的总时长。SE 是衡量睡眠连续性 的重要指标。 入睡潜伏期 (Sleep Onset Latency, SOL) 从关灯到首次进入任何睡眠阶段(N1, N2, N3 或 REM)所需的时间。 深睡眠比例 (N3%) N3% = (N3 期总时长 / TST) × 100%。深睡眠对于身 体恢复至关重要。 REM 睡眠比例 (REM%) REM% = (REM 期总时长 / TST) × 100%。REM 睡眠 与学习、记忆和情绪调节有关。 夜间醒来次数 (Number of Awakenings) 睡眠开始后,清醒总次数。 现在需要根据原始数据,为每一次睡眠记录计算出一系列公认的客观睡眠 质量评估指标。运用恰当的统计检验方法,分析三种光照环境对各项睡眠指标 的影响是否存在显著性差异。基于您的统计结果,得出结论:我们设计的“优 化光照”相比于“普通光照”和“黑暗环境”,是否对睡眠质量产生了有益的 改善? 问题四转入统计分析领域,考察前述设计光谱是否真正改善了人类睡眠。实验为典型的3组交叉实验,11位被试每人体验三种光照环境:优化光照、普通 LED 光照、黑暗环境。每次实 验产生一整晚的睡眠阶段数据(每30秒记录一次),需从中计算一系列标准睡眠指标进行比较 分析。 建模过程可分为两个阶段:首先基于阶段编码提取指标,包括 TST 、 SE 、 SOL 、N3%、 REM %、 醒来次数等;其次基于统计检验分析不同光照条件下这些指标的显著性差异。由于实验为配对设计(每人都有三组数据),应采用重复测量分析方法,如 Repeated Measures ANOVA (若数据正态)或 Friedman 检验(非参数)。若有显著性差异,再进一步用配对 T 检验或 Wilcoxon 检验分析优化光照与对照组的效果差异。 最终我们要回答的关键问题是:优化光照是否在统计意义上显著提升了睡眠质量。具体分析如下: 1.数据处理与指标提取:根据每30秒一条的睡眠阶段编码,计算出每次实验的关键指标,包括 TST 、 SE 、 SOL 、N3%、 REM %、夜间觉醒次数。 2.构建统计分析框架:由于每位被试在三种条件下都进行了实验,构成配对数据,适合使用重复测量的统计模型。 3.选择合适的统计检验: ·若数据满足正态性和方差齐性,可使用重复测量方差分析( Repeated Measures ANOVA )。·否则使用非参数 Friedman 检验。 4.后续配对比较:若总体差异显著,再进行配对的 T 检验或 Wilcoxon 检验,判断优化光照与普通光照、黑暗环境间的显著性差异。 5.得出结论:在统计检验基础上,给出是否支持"优化光照对睡眠具有正向促进作用"的结论。 模型 理由 重复测量 ANOVA / Friedman 检验 对应于交叉实验设计,比较三种光照下的指标差异 配对检验( Wilcoxon / T - test ) 精细评估光照对个体的改进效果 睡眠指标计算模型 根据 AASM 标准从阶段数据提取核心指标。根据以上内容进行模型的建立与求解
08-10
<think> 我们首先需要理解长格式和宽格式数据的特征: 长格式数据: - 通常包含标识变量(ID变量)和度量变量(时间/条件变量) - 每个观测对象有多个行,每个行代表一个时间点或条件 - 度量值通常在一列中 宽格式数据: - 每个观测对象独占一行 - 每个时间点或条件的度量值在不同的列中 判断方法: 1. 查看数据中是否有重复的ID(同一ID有多行),如果有则可能是长格式。 2. 查看列名:如果列名包含时间点或条件的标识(如"2020"、"2021"或"before"、"after"),则可能是宽格式。 3. 检查是否有明显的ID列和时间列。 步骤: 1. 检查数据中是否存在明显的ID列,并且该列是否有重复值。 2. 寻找是否有度量变量(如血压、成绩等)被分成了多列(比如不同时间的测量值)。 我们将使用以下方法: - 使用`dplyr`包来操作数据 - 使用`tidyr`包中的函数来帮助判断和转换 具体步骤: 1. 检查数据维度:`dim(data1)` 2. 查看前几行:`head(data1)` 3. 检查重复的ID:如果有ID列,检查重复情况;如果没有明显的ID列,则检查所有列的组合是否唯一(即每一行都是唯一的个体) 4. 识别度量变量:这些变量应该是数值型,并且可能被分到多个列(宽格式)或在一列中(长格式) 然而,没有明确的方法可以100%确定,因为数据可能既不是严格的长格式也不是宽格式。我们将基于以下假设: - 宽格式:每个个体一行,多个时间点或条件的测量值在不同的列中,且这些列有相似的前缀或命名模式(如“var_2010”,“var_2015”)。 - 长格式:每个个体有多行,并有时间列或条件列。 我们将尝试: 1. 寻找重复的行(按可能的主键分组,如果分组后行数不变,则可能是宽格式;否则长格式)。 2. 寻找具有相同名称模式的列(例如,都以“Value_”开头),这些列可能是同一变量的多次测量。 由于数据的具体结构未知,我们将编写一个函数来尝试识别宽格式变量。 计划: 1. 假设用户的数据中可能有一个或多个ID列(如“Country”,“ID”)。 2. 如果没有提供ID列,我们将检查每一行是否唯一(即没有重复行),如果是,则可能是宽格式(因为每个个体一行)。 3. 检查列名中是否包含时间或条件信息(如年份、阶段等)。 注意:有时数据可能是混合格式。 我们将做: - 找出所有数值列(因为度量值通常是数值的) - 检查这些数值列的名称是否有共同的模式(比如前缀相同,后缀是数字或时间) 函数:`identify_wide_vars` 输入:数据框 输出:一个列表,包含: - 格式判断(长或宽) - 可用的宽格式变量(即那些看起来是同一变量在不同时间或条件下的测量的多个列) 步骤: 1. 检查数据中是否有重复行(如果所有行都是唯一的,则可能是宽格式)。 2. 如果没有重复行,则我们初步判断为宽格式,然后寻找具有相同前缀的列(例如,以相同字符串开头,后面跟着数字或时间)。 3. 如果有重复行,则可能是长格式,但我们也要检查是否存在部分列是宽格式(混合格式)。 但是,更常见的是整个数据集要么是长格式要么是宽格式。 另一种方法:尝试寻找时间序列的列模式。例如,列名中包含年份或季度。 我们将: - 提取列名 - 使用正则表达式查找列名中是否包含4位数字(可能是年份)或其他时间标识 - 分组列名:去掉数字部分,看剩下的部分是否相同(如“GDP_2010”,“GDP_2015”都有“GDP”) 编写辅助函数: ```r # 判断数据格式并识别宽格式变量 identify_format <- function(data) { # 尝试寻找ID列:我们假设字符型或因子型的列可能是ID列,但用户可能有多个ID列 # 更通用的方法:检查是否有重复行(即没有主键) n_rows <- nrow(data) unique_rows <- nrow(unique(data)) # 如果所有行都是唯一的,则数据可能是宽格式(每个个体一行) if (n_rows == unique_rows) { format <- "wide" } else { format <- "long" } # 现在,我们尝试识别宽格式变量(即一组列,它们代表同一变量在不同时间或条件下的测量) # 方法:寻找列名模式:具有相同前缀,后缀不同(特别是后缀是数字或时间) col_names <- names(data) # 使用正则表达式将列名拆分为前缀和数字后缀 # 例如:匹配以非数字结尾的前缀,然后跟着数字 # 我们考虑两种情况:后缀是数字,或者后缀是时间(如年份) # 定义一个函数,提取列名的非数字部分,并看这个非数字部分是否重复出现 base_names <- gsub("\\d+$", "", col_names) # 移除末尾的数字 base_names <- gsub("_\\d{4}$", "", base_names) # 移除末尾的_加四位数字(年份) # 计算每个base_name出现的次数(忽略空字符串) base_counts <- table(base_names[base_names != ""]) # 重复出现(至少两次)的base_names可能代表一个宽格式变量组 repeated_bases <- names(base_counts)[base_counts >= 2] # 但是,我们还需要检查这些base_names对应的原始列是否都是数值列(因为宽格式变量通常是数值) wide_vars <- list() for (base in repeated_bases) { # 找到所有以这个base开头的列(注意:可能不是精确匹配,因为我们移除了后缀,所以用startsWith?) # 但我们的base_names是通过移除后缀得到的,所以我们需要匹配原始列名中包含base的列? # 更准确:我们之前用base_names向量,每个列名对应一个base_name,所以我们可以直接找base_names等于base的列 idx <- which(base_names == base) candidate_cols <- col_names[idx] # 检查这些列是否都是数值型 if (all(sapply(data[, candidate_cols, drop=FALSE], is.numeric))) { wide_vars[[base]] <- candidate_cols } } # 如果没有通过后缀数字找到,尝试另一种模式:列名中有下划线分隔,且最后一部分是年份(4位数字) if (length(wide_vars) == 0) { # 匹配末尾是4位数字的列名,且中间有分隔符(如_) year_pattern <- "_\\d{4}$" has_year <- grepl(year_pattern, col_names) if (any(has_year)) { # 提取基名(去掉年份部分) base_names_year <- gsub(year_pattern, "", col_names[has_year]) # 同样分组 base_counts_y <- table(base_names_year) repeated_bases_y <- names(base_counts_y)[base_counts_y >= 2] for (base in repeated_bases_y) { idx <- which(grepl(paste0("^", base, "_\\d{4}$"), col_names)) candidate_cols <- col_names[idx] if (all(sapply(data[, candidate_cols, drop=FALSE], is.numeric))) { wide_vars[[base]] <- candidate_cols } } } } return(list(format=format, wide_vars=wide_vars)) } ``` 注意:这个函数可能不完美,但可以作为一个起点。 使用示例: ```r result <- identify_format(data1) cat("数据格式:", result$format, "\n") if (length(result$wide_vars) > 0) { cat("检测到的宽格式变量组:\n") print(result$wide_vars) } else { cat("未检测到明显的宽格式变量组。\n") } ``` 如果数据是长格式,我们也可以尝试找出重复的度量变量名(比如在不同时间点重复测量同一变量,但在长格式中,这些值在一列中,而时间在另一列)。 但是,用户的问题要求找出“可用的宽格式变量”,即当前数据中已经是宽格式的变量组(同一变量在不同时间或条件下的多列)。 因此,我们只报告上述函数找到的宽格式变量组。 注意:如果数据是长格式,我们可能不会报告任何宽格式变量组(因为长格式通常不会将同一变量的多个时间点放在多列)。 然而,混合格式也是可能的,比如一部分变量是宽格式(例如,不同年份的GDP),另一部分变量是长格式(例如,每个国家一行,但有多个年份的GDP列)。所以即使数据有重复行(长格式特征),我们仍然可能找到宽格式变量组。 因此,我们修改上面的逻辑:我们不再通过行唯一性判断整个数据是宽格式还是长格式,而是关注是否存在宽格式变量组。并且,我们报告两个结果:整体格式的判断(可能不准确)和宽格式变量组。 用户更关心的是有哪些变量是以宽格式存在的。 因此,我们直接报告宽格式变量组,而整体格式判断仅作为参考。 我们将整体格式判断改为: - 如果至少存在一组宽格式变量,则数据包含宽格式部分。 - 否则,如果没有找到宽格式变量,则数据可能是长格式。 但注意:一个纯粹的长格式数据可能没有任何宽格式变量(因为所有度量变量都在一列里,而时间在另一列)。 所以,我们这样回答: - 首先报告是否找到宽格式变量组。 - 然后,根据重复行情况给出整体格式的推测。 修改函数:我们不再依赖行唯一性来判断宽格式变量,而是直接寻找变量组。 因此,我们直接返回找到的宽格式变量组,并额外提供行重复情况的判断。 最终输出: - 整体格式推测(基于行唯一性) - 找到的宽格式变量组 注意:行重复性判断可能不是绝对的,因为可能没有包含所有ID列。 我们可以让用户指定ID列,但问题中没有提供,所以我们假设用户没有指定。 执行步骤: 1. 计算重复行:`has_duplicate_rows <- nrow(data) != nrow(unique(data))` 2. 寻找宽格式变量组(如上) 然后输出。 示例代码: ```r # 加载必要的包 library(dplyr) # 定义函数 identify_wide_vars <- function(data) { # 检查重复行 n_rows <- nrow(data) n_unique_rows <- nrow(unique(data)) has_duplicate_rows <- (n_rows != n_unique_rows) # 整体格式推测:如果有重复行,可能是长格式,否则可能是宽格式 format_guess <- ifelse(has_duplicate_rows, "likely long format (each subject has multiple rows)", "likely wide format (each subject in one row)") # 识别宽格式变量组 col_names <- names(data) # 方法1: 移除末尾数字 base_names <- gsub("\\d+$", "", col_names) base_names <- gsub("_\\d{4}$", "", base_names) # 处理年份后缀 # 统计相同基名的出现次数 base_counts <- table(base_names[base_names != ""]) repeated_bases <- names(base_counts)[base_counts >= 2] wide_vars <- list() for (base in repeated_bases) { idx <- which(base_names == base) candidate_cols <- col_names[idx] # 确保这些列是数值型 if (all(sapply(data[, candidate_cols, drop=FALSE], function(x) is.numeric(x) || all(is.na(x))))) { # 允许包含NA(有些列可能是数值型但含有NA) wide_vars[[base]] <- candidate_cols } } # 方法2: 匹配年份后缀 if (length(wide_vars)==0) { year_pattern <- "_\\d{4}$" has_year <- grepl(year_pattern, col_names) if (any(has_year)) { base_names_year <- gsub(year_pattern, "", col_names[has_year]) base_counts_y <- table(base_names_year) repeated_bases_y <- names(base_counts_y)[base_counts_y >= 2] for (base in repeated_bases_y) { # 注意:这里要匹配完整的列名,确保后缀是4位数字 idx <- which(grepl(paste0("^", base, "_\\d{4}$"), col_names)) candidate_cols <- col_names[idx] if (length(candidate_cols) >= 2 && all(sapply(data[, candidate_cols, drop=FALSE], function(x) is.numeric(x) || all(is.na(x))))) { wide_vars[[base]] <- candidate_cols } } } } # 返回结果 return(list( format_guess = format_guess, wide_vars = wide_vars )) } # 应用函数 result <- identify_wide_vars(data1) # 输出结果 cat("数据格式判断:", result$format_guess, "\n\n") if (length(result$wide_vars) > 0) { cat("找到的宽格式变量组(即同一变量在不同时间点/条件下的多次测量):\n") for (i in seq_along(result$wide_vars)) { cat("变量组名:", names(result$wide_vars)[i], "\n") cat("包含的列:", paste(result$wide_vars[[i]], collapse=", "), "\n\n") } } else { cat("未找到宽格式变量组。\n") } ``` 注意:这个函数可能不完美,但可以作为一个起点。用户可能需要根据实际列名调整匹配模式。 最后,如果数据是长格式,用户可能需要将其转换为宽格式,这可以使用`pivot_wider`函数(来自`tidyr`包)实现。 生成相关问题: 1. 如何将长格式数据转换为宽格式? 2. 如何将宽格式数据转换为长格式? 3. 如何处理混合格式的数据? 4. 在转换数据格式时,如何处理缺失值? 注意:上面的函数假设数值列,但有些变量可能是分类变量,不过宽格式变量通常还是数值变量。如果用户有分类变量以宽格式存在(比如多个时间点的分类结果),那么我们可以放宽数值检查,但这样可能会误判。这里我们还是保持数值检查,因为通常度量变量是数值的。 如果用户的数据中宽格式变量是字符型,那么这个函数会跳过。如果用户需要,可以修改函数。 现在,我们执行这个函数并给出结果。 </think> 以下是一个用于检查数据格式并识别宽格式变量的 R 代码解决方案: ```r library(tidyverse) # 函数:检查数据格式并识别宽格式变量 identify_wide_format <- function(data) { # 1. 初步格式检查 cat("=== 数据格式初步诊断 ===\n") cat("总行数:", nrow(data), "\n") cat("总列数:", ncol(data), "\n") # 2. 识别可能的ID列(字符型或因子型列) id_candidates <- names(data)[sapply(data, function(x) is.character(x) | is.factor(x))] cat("\n可能的ID列:", if(length(id_candidates) > 0) paste(id_candidates, collapse = ", ") else "未发现", "\n") # 3. 检查重复行(宽格式应无完全重复行) duplicate_rows <- sum(duplicated(data)) cat("完全重复行数:", duplicate_rows, "\n") # 4. 识别宽格式变量组 numeric_cols <- names(data)[sapply(data, is.numeric)] wide_vars <- list() # 使用正则表达式检测具有相同前缀的数字列 for (pattern in c("\\d{4}$", "_\\d+$", "[A-Za-z]+\\d+")) { matched_cols <- numeric_cols[grepl(pattern, numeric_cols)] if (length(matched_cols) > 1) { # 提取变量名前缀 prefixes <- gsub(pattern, "", matched_cols) prefix_counts <- table(prefixes) # 找出出现频率高的前缀 common_prefixes <- names(prefix_counts)[prefix_counts > 1] for (pfx in common_prefixes) { var_group <- matched_cols[startsWith(matched_cols, pfx)] if (length(var_group) > 1) { wide_vars[[pfx]] <- var_group } } } } # 5. 格式判断逻辑 if (length(wide_vars) > 0) { format <- "宽格式 (wide format)" } else if (duplicate_rows > 0) { format <- "长格式 (long format)" } else { format <- "可能是宽格式,但未检测到明显的时间序列列命名模式" } # 返回结果 list( data_format = format, wide_variables = wide_vars, duplicate_rows_count = duplicate_rows, numeric_columns = numeric_cols ) } # 执行诊断 result <- identify_wide_format(data1) # 打印结果 cat("\n=== 最终诊断结果 ===\n") cat("数据格式:", result$data_format, "\n") cat("重复行数:", result$duplicate_rows_count, "\n\n") if (length(result$wide_variables) > 0) { cat("检测到的宽格式变量组:\n") for (i in seq_along(result$wide_variables)) { cat(sprintf("变量组 %d (%s): ", i, names(result$wide_variables)[i])) cat(paste(result$wide_variables[[i]], collapse = ", "), "\n") } } else { cat("未检测到宽格式变量组\n") cat("数值变量列表:", paste(result$numeric_columns, collapse = ", "), "\n") } ``` ### 代码功能说明 1. **格式诊断逻辑**: - 宽格式数据通常有多个数值列表示相同变量在不同时间点的测量值 - 长格式数据通常有重复的行结构,包含时间/条件标识列 - 通过检查列名模式(如以年份结尾)识别宽格式变量组 2. **关键检测方法**: - 识别数值变量中的时间序列模式列名(如 `GDP_2020`, `GDP_2021`) - 检测列名中的数字后缀模式 $$ \text{变量名}_{\text{时间点}} $$ - 分析可能的ID列(国家、个体ID等分类变量) - 检查完全重复行(长格式数据的典型特征) 3. **输出包括**: - 数据格式判断(宽格式/长格式) - 检测到的宽格式变量组(前缀相同的数值列集合) - 重复行数量(长格式指标) - 所有数值列列表 ### 使用示例输出 ``` === 数据格式初步诊断 === 总行数: 150 总列数: 20 可能的ID列: Country, Region 完全重复行数: 0 === 最终诊断结果 === 数据格式: 宽格式 (wide format) 重复行数: 0 检测到的宽格式变量组: 变量组 1 (GDP_): GDP_2010, GDP_2015, GDP_2020 变量组 2 (Population_): Population_2010, Population_2015, Population_2020 ``` ### 长宽格式转换建议 若需格式转换,推荐使用 `tidyr` 包: ```r # 宽转长 long_data <- data1 %>% pivot_longer( cols = starts_with("GDP_"), names_to = "Year", values_to = "GDP", names_prefix = "GDP_" ) # 长转宽 wide_data <- long_data %>% pivot_wider( names_from = Year, values_from = GDP, names_prefix = "GDP_" ) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值