如何找到每个离散变量组的水平

时间:2018-07-24 14:11:53

标签: r dplyr

不确定确切如何为我的问题加上标题,因此,如果我可以使其更清楚,请提供反馈。

我有一个数据框,其中的几列看起来与此类似:

    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中使用选择输入,甚至可能使用可手动操作的输入,但是我无法弄清楚如何在不将其硬编码为“选择”或“级别”的情况下呈现这些选择,这就是我在这里的原因。注意:我计划使用循环来动态生成selectInput或使用handontable来代替100多个组件。

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

这是我试图用ui完成的示例应用程序,而无需手动配置选择: Example ui

编辑:

希望这将对我的要求提供更好的说明。与levels(df$Component)以相同的方式提供“组件”类别的因子级别,是否有一种方法可以深入到每个组件以获取其级别?我知道某些功能能够以某种方式完成此任务,例如

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

根据按组件分组的值提供计数。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,解决方案是将数据的格式从长格式更改为宽格式。当前,节点的各个方面都在其自己的行上,这使得很难找出其可以具有的值。如果您将数据重整为宽格式,将很容易访问。

尝试一下:

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