我正在尝试根据组中同一数据框中另一列的唯一值,以降序或升序对数据框中的列进行重新排序。
为说明这一点,下面给出一个示例,其中一个数据框具有三列。目标是按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_by
和dplyr::arrange
应该是可能的,并且是最好的答案。
答案 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