将行与R中的交换列值组合在一起

时间:2015-11-05 18:50:35

标签: r dplyr

我有一个具有以下功能的数据框:

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中执行此操作? 其他建议也非常感谢。

1 个答案:

答案 0 :(得分: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作为另一种排序方式,在链接问题中进行了介绍。