r - 如何找到每个离散变量组的水平
问题描述
不确定如何为我的问题命名,所以如果我可以更清楚地说明,请提供反馈。
我有一个数据框,其中有几列类似于:
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)
提供基于按组件分组的值的计数。
解决方案
如果我正确理解您的问题,解决方案是将您的数据从长格式重塑为宽格式。目前,您在自己的行中拥有节点的各个方面,这使得很难找出它可以具有的值。如果您将数据重新整形为宽格式,它将很容易访问。
试试这个:
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
在将它们转换回因子后使用。
推荐阅读
- node.js - 当我指示它使用 dev 时,为什么我的 express 服务器使用 prod 配置
- node.js - Flutter:如何打印服务器错误“连接被服务器拒绝。” 使用基于 dio 和 NodeJs 的后端
- api - JIRA REST API 创建问题,包括“Components/s”字段
- c# - 如何使用 C# 执行映射规则
- python - 无法访问 Rasa 开源中的数据库 - 超时>错误
- python - 保留在列中具有相同值的组内
- laravel - 如何获取已存储在另一个模型中的名称 ID,并使用名称 ID 在 laravel 的数据透视表数据库中存储值?
- android - 如何将 Android 应用程序带到前台?(API 级别 27+)
- python - 所有参数都应具有相同的长度。参数 `y` 的长度是 6,而前面的参数 ['year'] 的长度是 100
- sql - 使用 EntityManager / Hibernate 进行批量更新