我有一个由
给出的帧数据库> A <- c(0,1,2,3,0,1)
> B <-c('NA','NA','NA','NA','NA','NA')
> C <- c('Fnord', 'Fnord','Applebees','Pumpkin','Applebees','Pumpkin')
> db <- data.frame(A,B,C)
具有db $ C [j] = db $ C [k]的属性,j!= k恰好一次。也就是说,每一行都与一个不同的行共享一个C值 - 每一行都有一个唯一的&#34; C-partner。&#34;我想创建一个函数,将db $ B替换为其&#34; C-partner的db $ A值。&#34;理想情况下,最终结果应该是
> db
A B C
1 0 1 Fnord
2 1 0 Fnord
3 2 0 Applebees
4 3 1 Pumpkin
5 0 2 Applebees
6 1 3 Pumpkin
.
.
.
到目前为止,我的尝试失败了。如果之前已经回答道歉 - 我的搜索没有给我答案。
我尝试过的一个例子是
db$D <- sapply(db$C, FUN=function(x) {return(sum(db$A %in% subset(db, C="x")))})
db$B <- db$D - db$A
但它没有给出我想要的东西。我不知道我哪里出错了。
编辑:为了清晰起见,添加了一些代码。
答案 0 :(得分:0)
这将创建一个与您的描述匹配的数据框:
db <- rbind(db, structure(list(A = 2:3, B = c(0L, 3L), C = structure(2:3, .Label = c("Applebees",
"Fnord", "Fnord2", "Pumpkin"), class = "factor")), .Names = c("A",
"B", "C"), row.names = c("7", "8"), class = "data.frame") )
# Then just merge with itself and remove the cases where the C values are '=='
mdb <- merge(db,db, by="A")
mdb[mdb$C.x != mdb$C.y, c('A', 'C.y', 'C.x')]
A C.y C.x
2 0 Applebees Fnord
3 0 Fnord Applebees
6 1 Pumpkin Fnord
7 1 Fnord Pumpkin
10 2 Fnord Applebees
11 2 Applebees Fnord
14 3 Fnord2 Pumpkin
15 3 Pumpkin Fnord2