根据列名模式拆分数据框,然后重新绑定到1个数据框

时间:2017-01-01 09:10:18

标签: r

寻求有关自动化我需要跨多个类型的多个数据集执行的任务的帮助。

以下是一些示例数据:

#create example data
x1_a<-rnorm(3)
x1_b<-rnorm(3)
x2_a<-rnorm(3)
x2_b<-rnorm(3)
x3_a<-rnorm(3)
x3_b<-rnorm(3)

df<-data.frame(x1_a, x1_b, x2_a, x2_b, x3_a, x3_b)

> df
       x1_a       x1_b       x2_a       x2_b       x3_a       x3_b
1 0.2912428  1.2737063 -0.9997475  1.0400489 -0.5323241 -0.2229865
2 2.0147965 -1.0180336  0.1080972  1.1411229  0.4791280  0.6230867
3 0.4189106 -0.6987785 -0.3890773 -0.3292366 -1.6186305  1.3913514

基本上,这些数据是宽格式的,我需要很长时间。但我不确定如何自动化这种转变。

在此数据中,列中的数值表示该列所属的观察结果(例如,x1_a与x1_b一起)。字符值表示列实际是什么。因此,匹配字符的列(例如,x1_a匹配x2_a,它们只是来自不同观察的“x_a”)是相同的事情,只是重复观察那个事物。

长格式数据只有字符串变量(此处为“x_a”或“x_b”),并且包含对该事物的重复观察。我不知道是否保留了原始数值。

我正在寻找的是一种自动化的方法,可以在可变长度数据集和不同的列名称之间执行以下代码(所有这些都与“x1_a”的基本模式匹配。

#laborious/embarassing, not good way to accomplish goal
df1<-df[,c("x1_a", "x1_b")]
names(df1)<-gsub("[[:digit:]]+", "", names(df1))
df2<-df[,c("x2_a", "x2_b")]
names(df2)<-gsub("[[:digit:]]+", "", names(df1))
df3<-df[,c("x2_a", "x2_b")]
names(df3)<-gsub("[[:digit:]]+", "", names(df1))

#desired data output
df<-do.call(rbind, list(df1, df2, df3))
> df
         x_a        x_b
1  0.2912428  1.2737063
2  2.0147965 -1.0180336
3  0.4189106 -0.6987785
4 -0.9997475  1.0400489
5  0.1080972  1.1411229
6 -0.3890773 -0.3292366
7 -0.9997475  1.0400489
8  0.1080972  1.1411229
9 -0.3890773 -0.3292366

我认为像这样自动化的东西可能会起作用:1)使用“grep”来拉出与数值匹配的列名(例如,x1_a与x1_b一致),2)重复这个以获得尽可能多的唯一数字值/组有,3)通过列名中的列名变量存储每个“拆分”,4)批量重命名这些列表元素中的列,以及5)将它们绑定回数据帧。

如果我忽略某些内容,可以链接到以前的帖子。提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

除了链接中提供的答案,还有dplyr / tidyr解决方案:

library(dplyr)
library(tidyr)
gather(df, key, x) %>% 
  mutate(key = factor(grepl("_b", key), labels=c("x_a", "x_b"))) %>%
  group_by(key) %>% 
  mutate(id=row_number()) %>% 
  spread(key, x)