将多列堆叠/合并为R中的多列

问题描述 投票:0回答:1

我正在尝试将数据帧的多个特定列合并/堆叠/收集为2列,并保留所有其他列。我已经尝试过很多关于stackoverflow的答案,但都没有成功(下面有一些)。我基本上在这里有类似于此职位的情况:Reshaping multiple sets of measurement columns (wide format) into single columns (long format)仅保留和合并更多列。重要的是要提到我的年份列是因素,并且我的列比下面列出的示例多得多,所以我要称呼列名而不是排名。

>df
ID Code Country     year.x   value.x  year.y value.y year.z value.z              
1  A    USA         2000     34.33422 2001 35.35241  2002   42.30042 
1  A    Spain       2000     34.71842 2001 39.82727  2002   43.22209 
3  B    USA         2000     35.98180 2001 37.70768  2002   44.40232 
3  B    Peru        2000     33.00000 2001 37.66468  2002   41.30232 
4  C    Argentina   2000     37.78005 2001 39.25627  2002   45.72927 
4  C    Peru        2000     40.52575 2001 40.55918  2002   46.62914

[我根据上面的帖子尝试在提迪尔中使用pivot_longer,这似乎非常相似,根据我的操作,会导致各种错误:

pivot_longer(df, 
             cols = -c(ID, Code, Country), 
             names_to = c(".value", "group"),
             names_sep = ".")

我还以各种方式处理了reshape2中的熔炉,这些熔炉仅熔化了值列或仅熔化了年列。如:

new.df <- reshape2:::melt(df, id.var = c("ID", "Code", "Country"), measure.vars=c("value.x", "value.y", "value.x.x", "value.y.y", "value.x.x.x", "value.y.y.y"), value.name = "value", variable.vars=c('year.x','year.y', "year.x.x", "year.y.y", "year.x.x.x", "year.y.y.y", "value.x", variable.name = "year")

我还尝试了基于其他帖子的dplyr收集,但是我很难理解帮助页面和帖子。要明确我要实现的目标:

ID Code Country  year   value                
1  A    USA      2000   34.33422  
1  A    Spain    2000   34.71842  
3  B    USA      2000   35.98180  
3  B    Peru     2000   33.00000  
4  C    Argentina2000   37.78005  
4  C    Peru     2000   40.52575 
1  A    USA      2001   35.35241  
1  A    Spain    2001   39.82727  
3  B    USA      2001   37.70768  
3  B    Peru     2001   37.66468  
4  C    Argentina2001   39.25627  
4  C    Peru     2001   40.55918 
1  A    USA      2002   42.30042  
etc.

我非常感谢您的帮助。

r dplyr tidyr reshape2 melt
1个回答
0
投票

我们可以指定names_pattern

library(tidyr)
library(dplyr)
df %>%  
   pivot_longer(cols = -c(ID, Code, Country),
       names_to = c(".value", "group"),names_pattern = "(.*)\\.(.*)")

或将names_sep与转义的.一起使用>

 pivot_longer(df, 
         cols = -c(ID, Code, Country), 
          names_to = c(".value", "group"),
          names_sep = "\\.")
© www.soinside.com 2019 - 2024. All rights reserved.