R将数据帧列与正则表达式组合在一起

时间:2016-04-22 00:41:52

标签: r

我有以下数据框:

<div class="heart"></div>
<div class="text">Love</div>

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

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()

毋庸置疑,这是不正确的。

3 个答案:

答案 0 :(得分:4)

这是基础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指标之间没有任何内容 - ({变量名中的{1}}和1。因此,所有重命名都是自动处理的。

如果我不设置2,可能会更明显:

timevar=NULL

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

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

答案 1 :(得分:3)

library(tidyr)
library(dplyr)

dat %>%
  gather(key, value, -c) %>% # this gets you were you were...
  separate(key, into = c("letter", "number"), sep = 1) %>%
  spread(letter, value) %>%
  select(-number)

答案 2 :(得分:2)

我们可以使用melt中的data.table patterns measure

library(data.table)
melt(setDT(dat), measure=patterns("^a\\d+", "^b\\d+"), 
                   value.name=c("a", "b"))[, variable:= NULL][]
#   c a b
#1: 1 1 5
#2: 2 2 6
#3: 1 3 7
#4: 2 4 8