用于循环粘贴行以从现有数据框创建新数据框

时间:2018-01-16 20:46:30

标签: r for-loop dataframe concatenation

SO的新手,但无法弄清楚如何让这段代码工作。我有一个非常大的数据帧,并设置如下:

Number    Year    Type    Amount
1         1       A       5
1         2       A       2
1         3       A       7
1         4       A       1
1         1       B       5
1         2       B       11
1         3       B       0
1         4       B       2

这可以用于多个数字。我想采用这个数据帧并创建一个包含两个行的新数据帧,但它将嵌套(例如,第1行和第2行,第1行和第3行,第1行和第4行,第2行和第2行) 3,第2行和第4行)每年的每个组合在类型和数字内。

示例输出:

Number    Year    Type    Amount   Number    Year    Type    Amount
1         1       A       5         1          2       A       2
1         1       A       5         1          3       A       7
1         1       A       5         1          4       A       1
1         2       A       2         1          3       A       7
1         2       A       2         1          4       A       1
1         3       A       7         1          4       A       1

我认为我会在数字和类型中执行for循环循环,但我不知道如何从那里进行行粘贴,或者如何确保我只获取行的组合一次。例如:

for(i in 1:n_number){
for(j in 1:n_type){
....}}

任何提示将不胜感激!我对编码比较陌生,所以我不知道我是否应该使用for循环。谢谢!

1 个答案:

答案 0 :(得分:0)

df <- data.frame(Number= rep(1,8),
                 Year = rep(c(1:4),2),
                 Type = rep(c('A','B'),each=4),
                 Amount=c(5,2,7,1,5,11,0,2))

我的解释是,您要创建包含所有行组合的数据框,其中NumberType相同且Year不同。

第一个建议 - 加入NumberType,然后删除具有不同Year的行。我添加了一个索引来防止冗余匹配(1表示2和2表示1)。

df$index <- 1:nrow(df)
out <- merge(df,df,by=c("Number","Type"))
out <- out[which(out$index.x>out$index.y & out$Year.x!=out$Year.y),]

第二个建议 - 如果你想看一个使用循环的版本。

out2 <- NULL
for (i in c(1:(nrow(df)-1))){
  for (j in c((i+1):nrow(df))){
    if(df[i,"Year"]!=df[j,"Year"] & df[i,"Number"]==df[j,"Number"]  & df[i,"Type"]==df[j,"Type"]){
      out2 <- rbind(out2,cbind(df[i,],df[j,]))
    }
  }
}