在r中为每四行应用排序功能将返回已排序的数据帧,但是如果没有扩展选择,则不会相应地对其他列进行排序

时间:2019-07-04 04:11:54

标签: r sorting

我需要每四行按第4列进行排序,与接下来的四行分别进行排序:

for (i in seq(1,nrow(data_frame), by=4)) { 

    data_frame[i:(i+3),4] <- sort(data_frame[i:(i+3),4], decreasing=TRUE) }

问题仅是第4列被排序,但相应的行仍被保留。

来自

x y z userID
-1 1 2 5      1
-2 1 1 2      2
-3 0 0 5      5
-6 1 2 5      3

-4 1 1 2      6
-5 0 0 5      4
-4 1 1 2      1
-5 0 0 5      5

至-

x y z userID
-1 1 2 5      5
-2 1 1 2      3
-3 0 0 5      2
-6 1 2 5      1

-4 1 1 2      6
-5 0 0 5      5
-4 1 1 2      4
-5 0 0 5      1

2 个答案:

答案 0 :(得分:0)

在基数R中,我们可以每4行splitorder第四列,并返回更新的数据帧。

df[] <- do.call(rbind, lapply(split(df, gl(nrow(df)/4, 4)), 
                  function(p) p[order(p[[4]], decreasing = TRUE), ]))

df
#  x y z userID
#1 0 0 5      5
#2 1 2 5      3
#3 1 1 2      2
#4 1 2 5      1
#5 1 1 2      6
#6 0 0 5      5
#7 0 0 5      4
#8 1 1 2      1

tidyverse使用相同逻辑的方法将是

library(tidyverse)
df %>%
  group_split(gl(n()/4, 4), keep = FALSE) %>%
  map_dfr(. %>% arrange(desc(userID)))

答案 1 :(得分:0)

使用ngx,我们可以使用/ngxtidyverse创建一个分组列,并将其用于%/%的'userID'

%/%

或将sortlibrary(tidyverse) df1 %>% group_by(grp = (row_number()-1) %/% 4 + 1) %>% #or use #group_by(grp = cumsum(rep(c(TRUE, FALSE, FALSE, FALSE), length.out = n()))) %>% mutate(userID = sort(userID, decreasing = TRUE)) # A tibble: 8 x 5 # Groups: grp [2] # x y z userID grp # <int> <int> <int> <int> <dbl> #1 1 2 5 5 1 #2 1 1 2 3 1 #3 0 0 5 2 1 #4 1 2 5 1 1 #5 1 1 2 6 2 #6 0 0 5 5 2 #7 1 1 2 4 2 #8 0 0 5 1 2 一起使用

base R

数据

ave