r-根据组中另一列中的唯一值排列列中的值

时间:2019-10-10 18:34:03

标签: r dataframe dplyr

我正在尝试根据组中同一数据框中另一列的唯一值,以降序或升序对数据框中的列进行重新排序。

为说明这一点,下面给出一个示例,其中一个数据框具有三列。目标是按gr列分组,并根据a列的唯一值对b列进行排序。因此,例如,如果在gr=1内列b的唯一值是T,那么我希望列a以升序排列,如果不是降序排列。下面是示例

# sample dataset
df <-  data.frame(
    a = c(1,3,2,4),
    b = c(T,T,F,F),
    gr = c(1,1,2,2)
  )

# split dataset according to a grouping column
df <- df %>% split(df$gr)

# ordering function
f1 <- function(dt) {
  if (unique(dt$b) == T) {
    arrange(dt, a)
  } else {
    arrange(dt, -a)
  }
}

所需的数据集应如下所示:

# order within groups based on variable b
df %>% purrr::map_df(f1) 

可以不使用列表或tidyr::nest来完成此操作吗?使用简单的dplyr::group_bydplyr::arrange应该是可能的,并且是最好的答案。

2 个答案:

答案 0 :(得分:3)

这是一种方法。

library(dplyr)

f2 <- function(dt) {
  2*as.integer(df$b) - 1
}

df %>% arrange(gr, a*f2())

如果您接受gr列的重新排列,请将其从arrange中删除。

df %>% arrange(a*f2())

编辑。

更简单?

f2 <- function(x) 2*x - 1

df %>% arrange(gr, a*f2(b))

答案 1 :(得分:2)

这是单独使用useEffect(() => { const printTable = () => { let newTable = [...table]; newTable[currentPosition.current] = 'red'; setTable(newTable); console.log('closure', table); }; function handleKeyPress(event) { switch (event.key) { case 'Left': // IE/Edge specific value case 'ArrowLeft': moveShape(-1); break; case 'Right': // IE/Edge specific value case 'ArrowRight': moveShape(1); break; default: return; } } function moveShape(direction) { currentPosition.current += direction; printTable(); } window.addEventListener('keydown', handleKeyPress); return () => window.removeEventListener('keydown', handleKeyPress); }, [table]); 的一种选择,而无需进行任何arrange

split

或者如果需要使用'b'

library(dplyr)
df %>%
   arrange(gr, c(1, -1)[gr] * a)
#  a     b gr
#1 1  TRUE  1
#2 3  TRUE  1
#3 4 FALSE  2
#4 2 FALSE  2

在这里,我们使用df %>% arrange(gr, c(-1, 1)[(b + 1)] * a) # a b gr #1 1 TRUE 1 #2 3 TRUE 1 #3 4 FALSE 2 #4 2 FALSE 2 'gr'。如果不是numeric,则用numeric创建分组索引,并使用它来更改'a'的值

match