R按块重塑、重组数据帧
我正在尝试重塑数据帧:R按块重塑、重组数据帧,r,dataframe,reshape,chunks,data-management,R,Dataframe,Reshape,Chunks,Data Management,我正在尝试重塑数据帧: DF id sex v1 v2 v3 v4 v5 v6 1 ID_1 male A1 A2 A3 B1 B2 B3 2 ID_2 female A1 A2 A3 B1 B2 B3 现在看起来是这样的: ID | Gender |A1 | A2 | A3 | B1 | B2 | B3 ID_1 | m | 3 | 3 | 3 | 2 | 3 | 2 ID_2 | f | 1 | 1 | 1 |
DF
id sex v1 v2 v3 v4 v5 v6
1 ID_1 male A1 A2 A3 B1 B2 B3
2 ID_2 female A1 A2 A3 B1 B2 B3
现在看起来是这样的:
ID | Gender |A1 | A2 | A3 | B1 | B2 | B3
ID_1 | m | 3 | 3 | 3 | 2 | 3 | 2
ID_2 | f | 1 | 1 | 1 | 4 | 4 | 4
我想要一些像:
ID | Gender | A1 | A2 | A3
ID_1 | m | 3 | 3 | 3 <- this would be columns A1 - A3 for ID 1
ID_1 | m | 2 | 2 | 2 <- this would be columns B1 - B3 for ID 1
ID_2 | f | 1 | 1 | 1 <- this would be columns A1 - A3 for ID 2
ID_2 | f | 4 | 4 | 4 <- this would be columns B1 - B3 for ID 2
ID | Gender | A1 | A2 | A3
ID|u 1 | m | 3 | 3正如@Andrie所说,第一步是将数据与给定的列(ID和性别)融合。正如您所说,您的问题是确定哪些列然后“组合”。这里有一种方法,最初将该信息编码为列名,然后从列名中取出
首先是一些虚拟数据
dat <- data.frame(ID=c("ID_1", "ID_2"), Gender=c("m","f"),
Test1.A = "A1", Test2.A = "A2", Test3.A = "A3",
Test1.B = "B1", Test2.B = "B2", Test3.B = "B3", stringsAsFactors=FALSE)
使用重塑2
软件包
library("reshape2")
融化数据,然后取变量
列,该列包含两条信息(测试和分组),并将这两条信息分为两列
dat.m <- melt(dat, id.vars=c("ID", "Gender"))
dat.m <- cbind(dat.m, colsplit(dat.m$variable, "\\.", names=c("Test", "Group")))
给
> dcast(dat.m, ID+Gender+Group~Test)
ID Gender Group Test1 Test2 Test3
1 ID_1 m A A1 A2 A3
2 ID_1 m B B1 B2 B3
3 ID_2 f A A1 A2 A3
4 ID_2 f B B1 B2 B3
那么:
> dat <- data.frame(id=c("id1","id2"),gender=c("m","f"),a.1=1:2,a.2=1:2,a.3=1:2,b.1=3:4,b.2=3:4,b.3=3:4)
> dat1 <- dat[,-(3:5)]
> dat2 <- dat[,-(6:8)]
> names(dat1)[3:5] <- c("v1","v2","v3")
> names(dat2)[3:5] <- c("v1","v2","v3")
>
> dat1$test <- "b"
> dat2$test <- "a"
> result <- rbind(dat1,dat2)
> dat
id gender a.1 a.2 a.3 b.1 b.2 b.3
1 id1 m 1 1 1 3 3 3
2 id2 f 2 2 2 4 4 4
> result
id gender v1 v2 v3 test
1 id1 m 3 3 3 b
2 id2 f 4 4 4 b
3 id1 m 1 1 1 a
4 id2 f 2 2 2 a
dat dat1 dat2名称(dat1)[3:5]名称(dat2)[3:5]
>dat1$测试dat2$测试结果dat
id性别a.1 a.2 a.3 b.1 b.2 b.3
1 id1 m 1 1 3 3 3
2 id2 f 2 2 4 4 4
>结果
id性别v1 v2 v3测试
1 id1 m 3 b
2 id2 f 4 b
3 id1 m 1 a
4 id2 f 2 a
我更喜欢Brian的答案,但这里有一种使用基本包的方法。在我看来,这很难看
您的数据帧:
DF
id sex v1 v2 v3 v4 v5 v6
1 ID_1 male A1 A2 A3 B1 B2 B3
2 ID_2 female A1 A2 A3 B1 B2 B3
代码
DFa使用从底部R重塑一个衬里
reshape(dat, varying = 3:8, idvar = 1:2, direction = 'long', drop=FALSE,
timevar = 'Test')
ID Gender Test Test1 Test2 Test3
ID_1.m.A ID_1 m A A1 A2 A3
ID_2.f.A ID_2 f A A1 A2 A3
ID_1.m.B ID_1 m B B1 B2 B3
ID_2.f.B ID_2 f B B1 B2 B3
告诉melt
前两列是id变量,即id.vars=…
第一部分工作,保留前两列没有问题,但是我不知道如何告诉R它应该在一列中重新排列所有Test1(A1,B1)/Test2(A2,B2)等。因此,我以三列而不是六列结束(示例二)…@Elisa,这看起来像是几个小时前您创建的问题的副本。如果是的话,请关闭另一个。是的,一些人努力为那个答案。。。(顺便说一句,这个更好,你只需要几行代码就能得到非常简单的答案)。。。您可能还想在问题的列中添加名称。谢谢您的所有想法。我会试试,如果有用的话,我会向你汇报。原始数据帧有更多的列和非常混乱的列名。因此,在重塑data+1之前,我可能必须对它们进行重命名——这是一个很难超越的解决方案。有人知道如何(在一行中)删除那些丑陋的行.name
?您可以通过添加一个参数new.row.names=1:4
来删除行.name
。如果你不想硬编码4,你可以很容易地根据数据计算出它,这就是我无法/无法计算的。哦,好吧,即使是两行,这也很不错。我已经有一段时间没有使用整形了,但我想知道这怎么不只是用一个列y变量来整形呢?我似乎根本无法让它真正起作用(猜测变量失败)。Elisa,如果所有应该重塑的列都以Fach开头,那么grep
可以帮助您为variang
参数获得正确的列:variang=grep(^Fach),colnames(origdata))
。和idvar
只是其他列(类似于1:(min(grep(^Fach),colnames(origdata))-1)
,您可以尝试timevar=“Fach”
[虽然我这里没有R来测试表达式-但至少这应该给您一个在哪里寻找解决方案的提示]John我不同意。我看到输出与OP的预期结果相同。只有4行而不是6行,因此我不理解您的判断。我的回答与其他回答之间的唯一区别是,我没有为a和B提供单独的列,因为这是响应中固有的(如果A1、A2、B1……实际上是数字,这可能是个问题)我对行进行了重新排序以匹配所需的结果。这是一个简单的拆分列和重新打包的情况。当我第一次复制并粘贴代码时,出于某种原因,它总共有6行。现在没有了。对不起。
DFa<-subset(DF, select=c(1:5))
DFb<-subset(DF, select=c(1:2, 6:8))
colnames(DFb)<-colnames(DFa)
DF<-as.data.frame(rbind(DFa,DFb))
rownames(DF)<-1:nrow(DF)
DF[order(DF$id),]
reshape(dat, varying = 3:8, idvar = 1:2, direction = 'long', drop=FALSE,
timevar = 'Test')
ID Gender Test Test1 Test2 Test3
ID_1.m.A ID_1 m A A1 A2 A3
ID_2.f.A ID_2 f A A1 A2 A3
ID_1.m.B ID_1 m B B1 B2 B3
ID_2.f.B ID_2 f B B1 B2 B3