R语言技术问询:如何一次性将4个变量转换为宽表?
搞定多变量宽表转换:把两年分数合并到同一行
嘿,我来帮你解决这个数据集格式转换的问题!你想要把同一个ID下不同年份的所有Score变量都合并到同一行,不用一个个处理,一次性就能搞定,下面给你两种实用的方法:
方法一:用tidyverse(推荐,灵活易读)
首先确保你装了tidyverse包,没装的话先跑这个:
install.packages("tidyverse") library(tidyverse)
先加载你的示例数据:
df <- data.frame(Year = c("2017","2018"), ID = c(1,1), Score = c("21","32"), Score2 = c("24","20"), Score3 = c("33", "26"), Score4 = c("25","32"))
接下来两行代码就能完成转换:先把所有Score列转成长格式,再重新转宽,把年份信息嵌到列名里:
df_wide <- df %>% # 把所有Score开头的列转成长表 pivot_longer(cols = starts_with("Score"), names_to = "score_type", values_to = "score_value") %>% # 按ID分组,把年份和分数类型组合成新列名,转成宽表 pivot_wider(names_from = c(Year, score_type), values_from = score_value)
跑出来的结果就是你想要的样子:
# A tibble: 1 × 8 ID `2017_Score` `2018_Score` `2017_Score2` `2018_Score2` `2017_Score3` `2018_Score3` `2017_Score4` `2018_Score4` <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 1 21 32 24 20 33 26 25 32
要是你想自定义列名格式(比如改成Score_2017而不是2017_Score),可以加一步修改列名的操作:
df_wide_custom <- df %>% pivot_longer(cols = starts_with("Score"), names_to = "score_type", values_to = "score_value") %>% mutate(new_colname = paste0(score_type, "_", Year)) %>% # 自定义列名拼接方式 select(-Year, -score_type) %>% pivot_wider(names_from = new_colname, values_from = score_value)
方法二:用base R(不用额外装包)
要是你不想装tidyverse,用base R自带的reshape函数也能直接搞定:
df_wide_base <- reshape(df, idvar = "ID", # 按ID分组 timevar = "Year", # 用Year区分不同行 direction = "wide") # 指定转成宽表
默认列名会用点分隔(比如Score.2017),要是想换成下划线,跑这行改列名:
colnames(df_wide_base) <- gsub("\\.", "_", colnames(df_wide_base))
这样两种方法都能一次性处理那4个Score变量,把两年的数据合并到同一行啦。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

