我正在尝试使用pivot_longer
。但是,我不确定如何使用names_sep
或names_pattern
来解决这个问题。
dat <- tribble(
~group, ~BP, ~HS, ~BB, ~lowerBP, ~upperBP, ~lowerHS, ~upperHS, ~lowerBB, ~upperBB,
"1", 0.51, 0.15, 0.05, 0.16, 0.18, 0.5, 0.52, 0.14, 0.16,
"2.1", 0.67, 0.09, 0.06, 0.09, 0.11, 0.66, 0.68, 0.08, 0.1,
"2.2", 0.36, 0.13, 0.07, 0.12, 0.15, 0.34, 0.38, 0.12, 0.14,
"2.3", 0.09, 0.17, 0.09, 0.13, 0.16, 0.08, 0.11, 0.15, 0.18,
"2.4", 0.68, 0.12, 0.07, 0.12, 0.14, 0.66, 0.69, 0.11, 0.13,
"3", 0.53, 0.15, 0.06, 0.14, 0.16, 0.52, 0.53, 0.15, 0.16)
所需输出(宽数据的第一行)
group names values lower upper
1 BP 0.51 0.16 0.18
1 HS 0.15 0.5 0.52
1 BB 0.05 0.14 0.16
4条答案
按热度按时间mbzjlibv1#
以下是@Fnguyen使用的类似方法的解决方案,但使用了较新的
pivot_longer
和pivot_wider
结构:大多数选择、分离、变异和重命名都发生在pivot函数调用中。
正则表达式"(. *)(..)$"表示:
()()找两部分
(. *)第一部分应包含零个或多个字符
(..)第二部分应该在字符串的“$”结尾只有2个字符
eimct9ow2#
一个data.table版本(还不确定如何保留原始名称,以便您不需要发布替换它们https://github.com/Rdatatable/data.table/issues/2551):
lfapxunr3#
根据你的示例数据,这个使用
dplyr
的解决方案对我来说很有效:slwdgvem4#
我想从@Dave2e提供的答案中添加一个替代
tidyverse
解决方案。像Dave 2 e的解决方案一样,它是一个两步的过程(* 首先重命名,然后重塑 *)。我使用
rename_with
将前缀“values”添加到名为“BP”、“HS”和“BB”的列中,而不是对数据进行两次整形。这对于在pivot_longer
的names_to
参数中使用.value
标记时正确获取列名是必要的。