寻求有关自动化我需要跨多个类型的多个数据集执行的任务的帮助。
以下是一些示例数据:
#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)将它们绑定回数据帧。
如果我忽略某些内容,可以链接到以前的帖子。提前感谢您的帮助!
答案 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)