当前位置: 首页 > 知识库问答 >
问题:

对长数据帧进行排序,就好像它很宽一样

姜泰宁
2023-03-14

我希望对长格式的数据帧进行排序,就好像它是宽格式的一样,但是我不希望改变数据帧的结构来使其变宽。如何使用tidyverse/dplyr工具来实现这一点,例如排列、组、forcat::fct_reorder等?

举个例子:如果数据是宽格式的,它会是这样的:

df1 <- data.frame(id = c("A", "B", "C"),
              col1 = c(8, 8, 7),
              col2 = c(7, 9, 3))

  id col1 col2
1  A    8    7
2  B    8    9
3  C    7    3

我会简单地按col1和col2对它进行排序,按两列的降序排列,所以它只是交换前两行。

事实上,我有很长的格式,如下所示:

df2 <- data.frame(id = c("A", "A", "B", "B", "C", "C"),
             type = c(1, 2, 1, 2, 1, 2),
             value = c(8, 7, 8, 9, 7, 3))

  id type value
1  A    1     8
2  A    2     7
3  B    1     8
4  B    2     9
5  C    1     7
6  C    2     3

在分类之后,我希望它看起来像这样:

      id type value
1  B    1     8
2  B    2     9
3  A    1     8
4  A    2     7
5  C    1     7
6  C    2     3

为了对单词进行排序,我想首先根据类型1的值进行排序,如果存在关联,则根据类型2的值对这些关联进行排序。

共有2个答案

夏立果
2023-03-14

使用dcast()-order()-melt()方法。

library(reshape2)
m1 <- dcast(df2, ... ~ id)
m2 <- m1[, order(-m1[2, ])]
m3 <- melt(m2, id=c("type"))
rm(m1, m2)

> m3[, c(2, 1, 3)]
  variable type value
1        B    1     8
2        B    2     9
3        A    1     8
4        A    2     7
5        C    1     7
6        C    2     3

数据

> dput(df2)
structure(list(id = structure(c(1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), type = c(1, 2, 1, 2, 1, 2), value = c(8, 
7, 8, 9, 7, 3)), class = "data.frame", row.names = c(NA, -6L))
米浩穰
2023-03-14

下面是一种可能的方法。它不是很简洁,但可以完成工作。

library(dplyr)

df2 %>%
  group_by(type) %>%
  arrange(id) %>%
  group_by(id) %>%
  mutate(
    col1 = ifelse(type == 1, value, NA),
    col1 = max(col1, na.rm = T),
    total = sum(value)
  ) %>%
  arrange(desc(col1), desc(total)) %>%
  select(id:value)

# # A tibble: 6 x 3
# # Groups:   id [3]
#   id     type value
#   <fct> <dbl> <dbl>
# 1 B         1     8
# 2 B         2     9
# 3 A         1     8
# 4 A         2     7
# 5 C         1     7
# 6 C         2     3
 类似资料:
  • 目前,我有一个名为的,看起来像这样,其中几何体表示一个点(纬度、经度)。 给定另一个点(lat,long),我想找到从这个数据框到那个特定点的最近点。我用距离函数计算了最近的点 现在我有一个系列,看起来像这样 我怎样才能得到一个Geodataframe的副本,它按相同的顺序排序,如下所示?谢谢

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-

  • 我有2个不同行的数据帧,dF1=(1098 x 2列)和df2=(1331 x2)例如: df1 df2 在pandas数据帧中,借助于获取彼此之间的最近点,我计算df1的每一行和df2的所有行之间的欧几里德距离,因此新的_df具有(1089 x 1331)。新德里 我想要这样的结果: 换句话说,我想让每一行新的_df按升序对列的值进行排序,最后返回我想要的结果。 我不能在熊猫数据帧中使用互相获取

  • 我想按值长度对Map进行排序。例如,我有这样的代码: 结果是: 所以我想做的是按值长度对这个Map进行排序,所以它返回:

  • 我试图将pandas数据帧从宽到长,但我找不到一个好方法。有没有建议通过熊猫来实现这一点? 预期结果:

  • 我有一个光谱仪的波长和吸光度输入文件。在这个文件中,数据被记录并作为数据帧的最后两列添加。柱需要指定测量特定吸光度(=数据)的波长。 我希望有一个数据框架,使我的分析更容易一点。诸如此类: 我知道,凭借我相当基本的python技能,我可能会将每个波长数据对存储为元组列表,并使一些复杂的排序魔法发生。但是自从我试图了解更多关于熊猫模块的信息以来,我一直在想我是否能更轻松地解决这个问题。然而,虽然我发