如何用R语言按相同ID将多列数据转为单列多行格式?
R语言实现ID匹配的列转行最简方案
直接用tidyr包的pivot_longer函数是最简洁直观的方式,不需要复杂的分组操作。
步骤1:构造原始数据
先把示例数据转换成R的数据框:
df <- data.frame( ID = c(1, 2, 3, 3, 4, 4, 4), V1 = c(3, 3, 5, 2, 2, 5, 1), V2 = c(2, 4, 1, 3, 3, 7, 3) )
步骤2:用pivot_longer实现转换
一行代码就能完成需求,指定要合并的列(除了ID之外的所有列),并设置新列名:
library(tidyr) # 转换数据 result <- pivot_longer(df, cols = -ID, names_to = NULL, values_to = "V3")
执行后得到的result就是你要的格式:
ID V3 1 1 3 2 1 2 3 2 3 4 2 4 5 3 5 6 3 1 7 3 2 8 3 3 9 4 2 10 4 3 11 4 5 12 4 7 13 4 1 14 4 3
备选:Base R实现(无需额外包)
如果不想加载第三方包,可以用reshape函数:
result_base <- reshape(df, direction = "long", varying = c("V1", "V2"), v.names = "V3", idvar = "ID", times = NULL) # 调整列顺序并去除行名 result_base <- result_base[, c("ID", "V3")] rownames(result_base) <- NULL
说明
你之前尝试的group by其实没必要,这类列转行操作本质是宽表转长表,pivot_longer是专门做这个的工具,逻辑清晰且代码极简。
内容的提问来源于stack exchange,提问作者ElHombre
相关产品推荐
相关产品推荐

