首页 > 解决方案 > 如何找到每个离散变量组的水平

问题描述

不确定如何为我的问题命名,所以如果我可以更清楚地说明,请提供反馈。

我有一个数据框,其中有几列类似于:

    Node     Component  Value
1     A        os.name RedHat
2     A     os.version  16.04
3     A docker.version 1.13.1
4     A kernel.version 3.10.0
5     B        os.name RedHat
6     B     os.version  16.04
7     B docker.version 1.12.1
8     B kernel.version 3.11.0
9     C        os.name Ubuntu
10    C     os.version  18.04
11    C docker.version 1.12.1
12    C kernel.version 3.12.0
13    D        os.name RedHat
14    D     os.version  17.04
15    D docker.version 1.13.1
16    D kernel.version 3.13.0

可以通过以下方式复制:

    structure(list(Node = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("A", "B", "C", 
"D"), class = "factor"), Component = structure(c(3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("docker.version", 
"kernel.version", "os.name", "os.version"), class = "factor"), 
    Value = structure(c(10L, 3L, 2L, 6L, 10L, 3L, 1L, 7L, 11L, 
    5L, 1L, 8L, 10L, 4L, 2L, 9L), .Label = c("1.12.1", "1.13.1", 
    "16.04", "17.04", "18.04", "3.10.0", "3.11.0", "3.12.0", 
    "3.13.0", "RedHat", "Ubuntu"), class = "factor")), class = "data.frame", row.names = c(NA, 
-16L))

此数据正在一个闪亮的应用程序中呈现,该应用程序用于查找未使用组件的正确版本(由值表示)的节点。我创建了一个“基线”数据框,其中列出了组件应使用的版本,并使用 rpivotTable 包,显示与此“基线”不匹配的节点。在某些情况下,基线可能需要由用户更新。我正在尝试确定一种向用户呈现每个组件的所有可能值的方法,以便他们可以被动地修改基线并且数据透视表将更新。

我考虑在 ui 中使用选择输入,甚至可能是一个动手操作,但我无法弄清楚如何在不将它们硬编码到“选择”或“级别”中的情况下呈现这些选择,这就是我在这里的原因。注意:有超过 100 个组件,我计划使用循环来动态生成 selectInput 或使用 handsontable)。

有没有办法访问每个变量组的级别?例如,用户将修改 os.verion 的基线并选择 16.04、17.04 或 18.04 作为目标基线。有没有办法利用 group_by 呢?

这是我尝试使用 ui 完成的示例应用程序,而无需手动配置选项: 示例用户界面

编辑:

希望这将为我的要求提供更好的说明。以同样的方式levels(df$Component)为组件类别提供因子级别,有没有办法深入到每个组件以获取它的级别?我知道某些功能能够以某种方式完成此任务,例如如何

df %>% group_by(Component) %>%
  add_count(Value)

提供基于按组件分组的值的计数。

标签: rdplyr

解决方案


如果我正确理解您的问题,解决方案是将您的数据从长格式重塑为宽格式。目前,您在自己的行中拥有节点的各个方面,这使得很难找出它可以具有的值。如果您将数据重新整形为宽格式,它将很容易访问。

试试这个:

library(tidyverse)

newdf <- spread(df, Component, Value, convert = TRUE)

#   Node docker.version kernel.version os.name os.version
# 1    A         1.13.1         3.10.0  RedHat      16.04
# 2    B         1.12.1         3.11.0  RedHat      16.04
# 3    C         1.12.1         3.12.0  Ubuntu      18.04
# 4    D         1.13.1         3.13.0  RedHat      17.04

unique(newdf$docker.version)

# [1] "1.13.1" "1.12.1"

该设置convert = TRUE会自动为新列选择合适的数据类型。您需要检查您是否希望发生这种情况。在这种情况下, os.version 列是数字类型,您可能不需要。它还将字符串列转换为字符而不是因子数据类型。这意味着您可以访问唯一值unique,也可以levels在将它们转换回因子后使用。


推荐阅读