如何根据一列依赖排序两列?

时间:2015-03-12 15:13:13

标签: r

我有一个像

这样的数据框
V1  V2 V3     V4  V5
a   bc  bm1   a   hdg7
ab  dd  dt3   bc  09Y
ac  ab  gh22  dd  JKJ8
dd  a   hd7   ac  hn
bc            ab  ml

我想对基于V2和V3的ob V1(V3依赖于V2)进行排序

输出如下

V1  V2 V3    V4   V5 
a   a   hd7   a   hdg7 
ab  ab  gh22  ab  ml
ac  -   -     ac  hn
dd  dd  dt3   dd  JKJ8
bc  bc  bm1   bc  09Y

事实上,我可以找到与V2类似的那些元素的索引,但我不知道它们是如何基于那样排列V2,V3的

matches <- unique(c(which(outer(df$V1, df$V2, "=="), arr.ind=TRUE)))

1 个答案:

答案 0 :(得分:1)

您可以使用match

indx23 <- with(df1, match(V1, V2))
indx45 <- with(df1, match(V1, V4))
df1[2:3] <- df1[indx23,2:3]
df1[4:5] <- df1[indx45,4:5]
 df1[is.na(df1)] <-''
df1
#  V1 V2   V3 V4   V5
#1  a  a  hd7  a hdg7
#2 ab ab gh22 ab   ml
#3 ac         ac   hn
#4 dd dd  dt3 dd JKJ8
#5 bc bc  bm1 bc  09Y

如果有更多列,您可以使用loop set来自data.table

library(data.table)
j1 <- as.integer(seq(2, ncol(df1), by=2)) 
setDT(df1)
for(j in j1){
  indx <- match(df1[['V1']], df1[[j]])
  set(df1, i=NULL, j=j, value=df1[[j]][indx])
  set(df1, i=NULL, j=j+1L, value=df1[[j+1L]][indx])
 }
df1
#   V1 V2   V3 V4   V5
#1:  a  a  hd7  a hdg7
#2: ab ab gh22 ab   ml
#3: ac NA   NA ac   hn
#4: dd dd  dt3 dd JKJ8
#5: bc bc  bm1 bc  09Y

或使用Map

中的base R
df1[-1] <- setNames(do.call(`cbind`,
           Map(function(x,y,z) data.frame(y,z)[match(x,y),], 
                df1['V1'], df1[j1], df1[j1+1])), names(df1)[-1])
df1[is.na(df1)] <- ''
df1
#  V1 V2   V3 V4   V5
#1  a  a  hd7  a hdg7
#2 ab ab gh22 ab   ml
#3 ac         ac   hn
#4 dd dd  dt3 dd JKJ8
#5 bc bc  bm1 bc  09Y