Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R按块重塑、重组数据帧_R_Dataframe_Reshape_Chunks_Data Management - Fatal编程技术网

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