2017-09-13 73 views
0

我试图做一个循环,将几个字段(字段1,字段2,字段3)R回路通过对数据子集的唯一复合键

field1 field2 field3 field4 field5 field6 field7 field8 
1 text text1 segment1 31-Jan-13 2.70 0.21 1.44 1.29 
2 text text1 segment1 01-May-13 0.70 2.90 0.76 0.38 
56 text text3 segment2 01-May-14 -1.50 -1.97 -1.79 -3.51 

当我这样做,通过使用作为一个重要选择数据一列工作原理:

for (j in 1:length(unique(InputData[,3]))) { 

    InputDataSubset <- InputData[InputData[,3] == unique(InputData[,3])[j],] 
print(unique(InputData[,3])[j]) 
print(InputDataSubset) 
} 

如果我尝试这样做,由几列:

for (j in 1:length(unique(InputData[,1:3]))) { 

    InputDataSubset <- InputData[InputData[,1:3] == unique(InputData[,1:3])[j,],] 
    print(unique(InputData[,3])[j]) 
    print(InputDataSubset) 
} 

我收到错误消息:

Error in Ops.data.frame(InputData[, 1:3], unique(InputData[, 1:3])[j, : 
    ‘==’ only defined for equally-sized data frames 

这样的问题怎么解决?提前致谢。

+1

'分裂(DF,DF [,C( “FIELD1”, “FIELD2”)])'。 – Frank

+1

也可以使用'dplyr :: group_by'。 – r2evans

+0

或者:'by(DF,DF [,c(“field1”,“field2”)],FUN = function(df)df)' – Parfait

回答

0

感谢冻糕

工作结果看起来像这样:

InputDataSubset<-by(InputData, InputData[, colnames(InputData)[1:3]], FUN=function(df) df) 


for (j in 1:length(InputDataSubset)) { 
    print(InputDataSubset[j]) 
} 
+0

很高兴能够提供帮助,因为'by'是一种使用不足但有用的切片/骰子方法,所提出的'split'是等价的。在'by'中,用'c(1:3)'替换'colnames(InputData)[1:3]'。并且为你的for循环使用:'lapply(InputDataSubset,print)'。 – Parfait