R语言中如何将同ID多行合并为一行并保留测试信息?
解决R语言长表转宽表(标记测试是否存在)的问题
嗨,作为R语言初学者遇到这种数据格式转换的问题太正常啦,这其实是典型的长格式数据转宽格式数据的需求,我给你两种常用的解决方案,都能得到你想要的结果:
第一步:先还原你的原始数据
首先我们先把你提供的data.frame构造出来,方便后续测试:
# 构造原始数据框 df <- data.frame( ID = c("1", "1", "2", "2", "3", "4"), test = c("testA", "testB", "testA", "testB", "testA", "testB"), stringsAsFactors = FALSE )
方法一:用tidyverse工具包(推荐,灵活易扩展)
tidyverse里的pivot_wider()函数专门用来做长转宽的操作,步骤很清晰:
# 先加载tidyverse包(如果没安装的话先运行 install.packages("tidyverse")) library(tidyverse) # 长转宽并填充0/1 df_wide <- df %>% mutate(value = 1) %>% # 给每个已完成的测试标记为1 pivot_wider( id_cols = ID, # 按ID分组 names_from = test, # 把test列的内容作为新的列名 values_from = value, # 用value列的值填充新列 values_fill = 0 # 没有对应测试的位置填充0 ) # 可选:把ID从字符型转成数值型(如果需要的话) df_wide$ID <- as.numeric(df_wide$ID) # 查看结果 df_wide
运行后就能得到你想要的输出:
ID testA testB 1 1 1 1 2 2 1 1 3 3 1 0 4 4 0 1
方法二:用基础R的table函数(无需额外装包)
如果你不想加载外部包,用基础R的table()函数也能快速解决:
# 生成ID和test的交叉频数表 table_result <- table(df$ID, df$test) # 把频数表转成数据框 df_wide_base <- as.data.frame.matrix(table_result) # 把行名转成ID列 df_wide_base <- tibble::rownames_to_column(df_wide_base, "ID") # 可选:转换ID为数值型 df_wide_base$ID <- as.numeric(df_wide_base$ID) # 查看结果 df_wide_base
这个方法的结果和上面完全一致,优点是不用安装额外包,适合快速处理简单需求。
内容的提问来源于stack exchange,提问作者Robby
相关产品推荐
相关产品推荐

