R将数据框列与正则表达式结合起来

标签 r

<分区>

我有以下数据框:

dat <- data.frame(
    c = c(1 , 2) , a1 = c(1 , 2) , a2 = c(3 , 4) , b1 = c(5 , 6) , b2 = c(7 , 8)
)
  c a1 a2 b1 b2
1 1  1  3  5  7
2 2  2  4  6  8

我想根据共享前缀合并列以成为此数据框:

dat2 <- data.frame(
    c = c(1 , 2 , 1 , 2) , a = c(1 , 2 , 3 , 4) , b = c(5 , 6 , 7 , 8)
)
  c a b
1 1 1 5
2 2 2 6
3 1 3 7
4 2 4 8

我能想到的唯一方法是尝试使用 melt() 来做到这一点。这是我的尝试:

melt(dat , measure.vars = c(grep("^a" , colnames(dat)) , grep("^b" , colnames(dat))))
    variable value
1 1       a1     1
2 2       a1     2
3 1       a2     3
4 2       a2     4
5 1       b1     5
6 2       b1     6
7 1       b2     7
8 2       b2     8
>

不用说,这是不正确的。

最佳答案

在这种情况下,基本 R 的 reshape 实际上非常适合。

reshape(dat, idvar="c", direction="long", sep="", varying=-1, timevar=NULL)

#    c a b
#1.1 1 1 5
#2.1 2 2 6
#1.2 1 3 7
#2.2 2 4 8

sep="" 本质上告诉 reshape() 组标识符(ab 在本例中)和 time 指示符 -(在本例中为 12)在你的变量名中。所以所有的重命名都是自动处理的。

如果我不设置 timevar=NULL 可能会更明显:

reshape(dat, idvar="c", direction="long", sep="", varying=-1)

#    c time a b
#1.1 1    1 1 5
#2.1 2    1 2 6
#1.2 1    2 3 7
#2.2 2    2 4 8

如果您有许多 id 变量希望为您的其他融化数据保持不变,请尝试以下代码:

# an example bit of data
dat2 <- cbind(x=1:2,y=2:3,z=3:4, dat)
dat2

#  x y z c a1 a2 b1 b2
#1 1 2 3 1  1  3  5  7
#2 2 3 4 2  2  4  6  8

idv <- match(c("x","y","z","c"), names(dat2))
reshape(dat2, idvar=idv, direction="long", sep="", varying=-idv, timevar=NULL)

#          x y z c a b
#1.2.3.1.1 1 2 3 1 1 5
#2.3.4.2.1 2 3 4 2 2 6
#1.2.3.1.2 1 2 3 1 3 7
#2.3.4.2.2 2 3 4 2 4 8

关于R将数据框列与正则表达式结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782760/

相关文章:

r - R 的 apply 系列不仅仅是语法糖吗?

r - 导入excel文件

r - ggpubr/ggbarplot 中的错误栏突然合并(没有更改代码),我怎样才能再次将它们分开?

r - com.google.android.material.R 无法解析底部导航 View 的符号 'R'

r - 在geom_boxplot中包含用于填充美学的缺失因子水平的空间

r - 在 R 中搜索多个术语

r - lapply/R中的 promise

r - 从日期中提取年份的天数

r - 将渐变图例的比例更改为具有特定中断的百分比

delphi - Delphi 有免费的统计包吗?