Пользовательская сортировка значений в кадре данных в R - PullRequest
0 голосов
/ 17 мая 2019

Я новичок, пытающийся выучить R, и у меня есть такой кадр данных:

  a b c d
a 0 6 2 0
b 1 0 3 0
c 0 0 0 2
d 0 0 0 0 

Я хочу отсортировать данные по двум действиям: 1. Сначала найдите строку, которая имеет максимальное ВСЕГО значение, и создайте это

  a b c d  TOTAL
a 0 6 2 0    8
b 1 0 3 0    4
c 0 0 0 2    2
d 0 0 0 0    0
  1. Во-вторых, выберите строку с максимальным значением и запишите скрещенные значение перед каждым символом от макс. до мин. В результате получается новый фрейм данных:
    'x'
a-b  6    #considering values for "a" where it meets "b"
a-c  2
b-c  3  #b has the second max TOTAL value
b-b  1
c-d  2  # finally, values in front of c

Буду признателен за помощь.

Ответы [ 3 ]

2 голосов
/ 17 мая 2019

РЕДАКТИРОВАТЬ: добавление исходных данных внизу

library(tidyr); library(dplyr)
df %>%
  gather(col, val, -row) %>%   # Pull into long form, with one row for each row-col
  arrange(row, -val) %>%       # Sort by row and descending value
  filter(val != 0) %>%         # Only keep non-zeros
  unite("row", c("row", "col"))# combine row and col columns

  row val
1 a_b   6
2 a_c   2
3 b_c   3
4 b_a   1
5 c_d   2

# Inputing data with "row" column
df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "row  a b c d
a 0 6 2 0
b 1 0 3 0
c 0 0 0 2
d 0 0 0 0 ")
1 голос
/ 17 мая 2019

Не совсем уверен, но вы этого хотите?Вы говорите, что у вас есть фрейм данных, но похоже, что у вас есть матрица, и неясно, хотите ли вы сохранить свое первое действие или это просто промежуточный шаг.

mat <- as.matrix(df)

df1 <- data.frame(addmargins(mat, 2))

df1

  a b c d Sum
a 0 6 2 0   8
b 1 0 3 0   4
c 0 0 0 2   2
d 0 0 0 0   0

df2 <- as.data.frame(as.table(mat))

df2 <- df2[df2$Freq != 0,]

df2[with(df2, order(ave(Freq, Var1, FUN = sum), Freq, decreasing = TRUE)), ]

   Var1 Var2 Freq
5     a    b    6
9     a    c    2
10    b    c    3
2     b    a    1
15    c    d    2

Данные:

df <- read.table(text="a b c d
 0 6 2 0
 1 0 3 0
 0 0 0 2
 0 0 0 0", header = TRUE, row.names = letters[1:4])
0 голосов
/ 17 мая 2019

Первый вопрос просто rowSums, для вас второй, я использую melt, затем заказ с groupby max и само значение

s=setNames(reshape2::melt(as.matrix(df)), c('rows', 'vars', 'values'))
s=s[s$values!=0,]
s[order(-ave(s$values,s$rows,FUN=max),-s$values),]
rows vars values
5     a    b      6
9     a    c      2
10    b    c      3
2     b    a      1
15    c    d      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...