2016-09-04 39 views
-2

实施例:加入和顺序列

a b p.a p.b 
1 2 x  y 
3 4 c  d 
2 1 y  x 
5 6 f  e 
1 1 x  x 

我想加入p.ap.b(的ab属性),因此,如果有发生对ab所有对ba应转过来成对ab和属性的顺序应保留,然后加入到一个新的列。所以只有前两列变化,最后两列也应该改变。我知道我可以使用paste来连接两列,但我不确定如何正确获取列条目的顺序。

结果应该如下:

a b p.a p.b joined 
1 2 x  y  xy 
3 4 c  d  cd 
1 2 x  y  xy 
5 6 f  e  fe 
1 1 x  x  xx 

并不重要,对于ab行是否1 22 1,但如果有1 2应该没有2 1反之亦然

+0

您确实需要提供可能变化的数据;你有什么可以用'paste0'来解决,但这听起来不像你需要的逻辑。 – alistaire

+0

我认为这是所有可能的。除了我有更多的元素比1,2,3,4和c,d,x,y。 @akrun的解决方案似乎是我需要的。 – doc

+0

@alistaire如果你不知道我想如何处理某些情况,那会是哪种情况?我想完成表格以使其更清晰。 – doc

回答

1

使用更新的数据集,我们可以遍历行,根据前两列元素得到order,根据这两列获得列。

df2 <- do.call(rbind, lapply(seq_len(nrow(df1)), function(i) { 
       x1 <- df1[i,] 
       i1 <- order(unlist(x1[1:2])) 
       x1[1:2] <- unlist(x1[1:2])[i1] 
       x1[3:4] <- unlist(x1[3:4])[i1] 
       x1})) 

df2$joined <- do.call(paste0, df2[3:4]) 
df2 
# a b p.a p.b joined 
#1 1 2 x y  xy 
#2 3 4 c d  cd 
#3 1 2 x y  xy 
#4 5 6 f e  fe 
#5 1 1 x x  xx 
+0

好的,所以有这个问题,看看你的第一个解决方案:第三和第四列应该只会改变,如果第一和第二列改变。据我看到'a,b'和'p.a,p.b'只是按字母顺序改变。但'p.a'和'p.b'是'a'和'b'的属性。所以如果有'1 2 y x',它会变成'1 2 x y',对吗? – doc

+0

@doc我用新的数据集更新了解决方案。应用第二种解决方案后,我得到预期产出 – akrun

+0

不,第4行不同。输出应该是'5 6 f e fe',因为'f e'只有在'5 6'改变时才会改变。 '5 6'然而不改变,所以不应该'f e' – doc