我有一个像
这样的数据框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)))
答案 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