【问题标题】:A Custom sort of the values within a dataframe in RR中数据框中的值的自定义排序
【发布时间】:2019-05-17 14:37:31
【问题描述】:

我是一个尝试学习 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. 首先,找到具有最大 TOTAL 值的行并创建它

  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

感谢您在这方面的帮助。

【问题讨论】:

  • 你的第二点不太清楚。
  • 对不起,我试图改进它。找到哪个元素的最大值后,我想记录一下它们前面的值,从最大值到最小值。
  • 还不清楚。为什么a-b 6?
  • @NelsonGon 如果您查看前两个表,a-b 显示了 a 和 b 相互交叉的值。
  • 你能解释一下为什么 b-b 是 1 吗?

标签: r dataframe datatable


【解决方案1】:

编辑:在底部添加源数据

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 ")

【讨论】:

  • 这似乎是一个优雅的解决方案,但我在检查您的代码时收到了这个错误:``-x 中的错误:一元运算符的参数无效" 你能告诉我我错过了什么吗?
  • 我从您提供的文本中导入了您的数据,并将第一列称为“行”。为了使您的问题更易于回答,最好包含dput(YOUR_DATA) 的输出,以便我们可以以与您相同的形式处理您的数据。否则,我们只能猜测您的数据是否在矩阵、数据框、数据表中,包含字符、因子、整数、浮点数等。
【解决方案2】:

不完全确定,但这是您想要的吗?你说你有一个数据框,但它看起来更像是一个矩阵,不清楚你是想保留你的第一个动作还是这只是一个中间步骤。

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])

【讨论】:

    【解决方案3】:

    第一个问题只是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2013-10-12
      • 2021-10-14
      • 2017-08-21
      相关资源
      最近更新 更多