2015-11-05 57 views
0

我有以下特征的数据帧:结合排,交换列值中的R

one = c("A", "A", "B" ,"C") 
two = c("B", "C", "A", "A") 
three = c(150, 0, 0, 160) 
four = c(0, 200, 190, 0) 

df <- data.frame(one, two, three, four) 
df 
    one two three four 
1 A B 150 0 
2 A C  0 200 
3 B A  0 190 
4 C A 160 0 

我想,其中一列的值出现在两个列,反之亦然,以行合并:

one two three four 
1 A B 150 200 
2 A C 190 160 

有没有办法在dplyr中做到这一点? 其他建议也非常感谢。

+0

这可能是http://stackoverflow.com/q/15487151的副本 – Frank

回答

1

随着data.table,你可以做

library(data.table) 
setDT(df)[one > two, c("one","two") := .(two, one)] 
df[, lapply(.SD,sum), by=.(one,two)] 

或dplyr,巴洛克式的模拟:

library(dplyr) 
df %>% 
    mutate(
    bad = one > two, 
    one = ifelse(bad, two, one), 
    two = ifelse(bad, .$one, two), 
    bad = NULL) %>% 
    group_by(one,two) %>% 
    summarise_each(funs(sum)) 

的想法是通过交换他们在那里无序到第一和第二列进行排序。将pminpmax作为链接问题的另一种排序方式。