【发布时间】:2020-03-10 02:09:07
【问题描述】:
我有一个不整洁的数据集。
dat_untidy <- data.frame(AFDWSDF = c(10, 20),
AFDWSDFQUAL = c("a","b"),
TPFCE = c(1, 1.5),
TPFCEQUAL = c("c","d"))
变量名称包含 3 或 4 条信息,我想将它们分解并存储为单个变量:
dat_tidy <- data.frame(Var_X = c(rep("AFDW", 2),rep("TP", 2)),
Var_Y = c(rep("SD", 2), rep("FC", 2)),
Var_Z = c(rep("F", 2), rep("E", 2)),
Value = c(10, 20, 1, 1.5),
Qualifier = c("a","b","c","d"))
变量名称的格式为 xxxxyyz。 “xxxx”、“yy”和“z”都应该成为一个变量值。 'yy' 和 'z' 始终分别是 2 和 1 个字符,但 'xxxx' 可以是任意数量的字符。
最重要的是,在我的示例中,变量(大部分)成对出现,“xxxxyyz”与“xxxxyyzQUAL$”(基准值的限定符代码)相邻。 “...QUAL$”也需要收集到一个整洁的变量中。
从 vingette 中的 Anscombe 示例,感觉 pivot_longer() 可能是一个优雅的解决方案,但我需要帮助定义正则表达式模式。我怀疑将其分为两个步骤可能更简单,也许首先是 pivot_longer() 将变量名收集到所谓的 Var_XYZ 中,关联 Value 和 Qualifier,然后是 mutate() 到分解Var_XYZ,但我也无法解决这个问题。
我是一个正则表达式的新手,并且最熟悉 dplyr 的操作。
提前谢谢你。
【问题讨论】:
-
您是否能够使用 $ 登录列名创建第一个数据框。我认为 R 不会允许
-
你是对的,我的错误是无法在列名中使用 $ 构建第一个数据框。这些字符包含在我从电子表格中读取的原始数据中。可以和这个问题分开处理,感谢编辑帖子。
-
事实证明,我的真实数据中值和限定符列的不一致配对(我在我的问题中没有强调)打破了@Edward 和 Wimpel 原本不错的解决方案。