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循环。谢谢!
答案 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))
我的解释是,您要创建包含所有行组合的数据框,其中Number
和Type
相同且Year
不同。
第一个建议 - 加入Number
和Type
,然后删除具有不同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,]))
}
}
}