我有一个具有以下功能的数据框:
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 :(得分: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))
这个想法是通过将它们交换到无序的位置来对第一列和第二列进行排序。将pmin
和pmax
作为另一种排序方式,在链接问题中进行了介绍。