如何解决在Tidyr中使用ivot_longer和复杂的分隔符
在上一篇文章here中,我尝试使用y/{ABCDEFGHI/0123456789/
来获得rbind。这就是数据和解决方案。
tidyr::pivotlonger()
此解决方案完全取决于均值和sd变量的命名约定。如果存在不同的命名约定,则在列名称的两个重要节点之间使用更复杂的分隔符,例如...
set.seed(1)
df1 <- data.frame(group = rep(letters[1:2],each=3),day = rep(1:3,2),var1_mean = round(rnorm(6),var1_sd = round(rnorm(6,5),var2_mean = round(rnorm(6),var2_sd = round(rnorm(6,2))
# group day var1_mean var1_sd var2_mean var2_sd
# 1 a 1 -0.63 5.49 -0.62 5.82
# 2 a 2 0.18 5.74 -2.21 5.59
# 3 a 3 -0.84 5.58 1.12 5.92
# 4 b 1 1.60 4.69 -0.04 5.78
# 5 b 2 0.33 6.51 -0.02 5.07
# 6 b 3 -0.82 5.39 0.94 3.01
df1 %>%
pivot_longer(cols = starts_with('var'),names_to = c('grp','.value'),names_sep="_")
# group day grp mean sd
# <fct> <int> <chr> <dbl> <dbl>
# 1 a 1 var1 -0.63 5.49
# 2 a 1 var2 -0.62 5.82
# 3 a 2 var1 0.18 5.74
# 4 a 2 var2 -2.21 5.59
# 5 a 3 var1 -0.84 5.58
# 6 a 3 var2 1.12 5.92
# 7 b 1 var1 1.6 4.69
# 8 b 1 var2 -0.04 5.78
# 9 b 2 var1 0.33 6.51
# 10 b 2 var2 -0.02 5.07
# 11 b 3 var1 -0.82 5.39
# 12 b 3 var2 0.94 3.01
如何使用单个df2 <- data.frame(group = rep(letters[1:2],mean_var_1 = round(rnorm(6),sd_var_1 = round(rnorm(6,mean_var_2 = round(rnorm(6),sd_var_2 = round(rnorm(6,2))
df2
# group day mean_var_1 sd_var_1 mean_var_2 sd_var_2
# 1 a 1 0.62 6.36 -0.39 5.70
# 2 a 2 -0.06 4.90 -0.06 5.56
# 3 a 3 -0.16 5.39 1.10 4.31
# 4 b 1 -1.47 4.95 0.76 4.29
# 5 b 2 -0.48 3.62 -0.16 5.36
# 6 b 3 0.42 4.59 -0.25 5.77
和mean
列并将sd
和var_1
作为分组变量来实现与第一个示例类似的结果?>
解决方法
如果名称复杂,则可以使用names_pattern
参数,在其中可以指定如何使用列名称的每个部分来获取长格式的数据。
tidyr::pivot_longer(df2,cols = contains('var'),names_to = c('.value','grp'),names_pattern = '(.*?)_(.*)')
# group day grp mean sd
# <chr> <int> <chr> <dbl> <dbl>
# 1 a 1 var_1 0.62 6.36
# 2 a 1 var_2 -0.39 5.7
# 3 a 2 var_1 -0.06 4.9
# 4 a 2 var_2 -0.06 5.56
# 5 a 3 var_1 -0.16 5.39
# 6 a 3 var_2 1.1 4.31
# 7 b 1 var_1 -1.47 4.95
# 8 b 1 var_2 0.76 4.29
# 9 b 2 var_1 -0.48 3.62
#10 b 2 var_2 -0.16 5.36
#11 b 3 var_1 0.42 4.59
#12 b 3 var_2 -0.25 5.77
'(.*?)_(.*)'
使用两组数据,其中第一组是列名称中第一个下划线((.*?)
之前的所有内容,第二组是第一组({{ 1}})。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。