R,data.table或dplyr,长格式拆分并列名 [英] R, data.table or dplyr, long format splitting colnames

查看:16
本文介绍了R,data.table或dplyr,长格式拆分并列名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个数据帧,其列名为Mary1、Mary2、Mary3、Bob1、Bob2、Bob3、Pam1、Pam2、Pam3等,但列要多得多。

让我们举一个更简单、可重现的例子。

set.seed(1)
mydata <- data.frame()
mydata <- rbind(mydata,c(1,round(runif(30),3)))
mydata <- rbind(mydata,c(2,round(runif(30),3)))
mydata <- rbind(mydata,c(3,round(runif(30),3)))
colnames(mydata) <- c("id", paste0(rep(LETTERS[1:10], each=3), 1:3))   

这意味着:

id    A1    A2    A3    B1    B2    B3    C1    C2    C3    D1    D2    D3    E1    E2    E3    F1    F2    F3    G1    G2    G3    H1    H2    H3    I1    I2    I3    J1    J2    J3  ...
1  0.266 0.372 0.573 0.908 0.202 0.898 0.945 0.661 0.629 0.062 0.206 0.177 0.687 0.384 0.770 0.498 0.718  0.992 0.380 0.777 0.935 0.212 0.652 0.126 0.267 0.386 0.013 0.382 0.870 0.340  ...
2  0.482 0.600 0.494 0.186 0.827 0.668 0.794 0.108 0.724 0.411 0.821 0.647 0.783 0.553 0.530 0.789 0.023  0.477 0.732 0.693 0.478 0.861 0.438 0.245 0.071 0.099 0.316 0.519 0.662 0.407  ...
3  0.913 0.294 0.459 0.332 0.651 0.258 0.479 0.766 0.084 0.875 0.339 0.839 0.347 0.334 0.476 0.892 0.864  0.390 0.777 0.961 0.435 0.713 0.400 0.325 0.757 0.203 0.711 0.122 0.245 0.143  ...

我想要一个长表格式,如下所示:

set.seed(1)
mydata <- data.frame()
mydata <- rbind(mydata,c(1,1,round(runif(10),3)))
mydata <- rbind(mydata,c(1,2,round(runif(10),3)))
mydata <- rbind(mydata,c(1,3,round(runif(10),3)))
mydata <- rbind(mydata,c(2,1,round(runif(10),3)))
mydata <- rbind(mydata,c(2,2,round(runif(10),3)))
mydata <- rbind(mydata,c(2,3,round(runif(10),3)))
colnames(mydata) <- c("id","N", LETTERS[1:10])

那是:

 id  N     A     B     C     D     E     F     G     H     I     J
  1  1 0.266 0.372 0.573 0.908 0.202 0.898 0.945 0.661 0.629 0.062
  1  2 0.206 0.177 0.687 0.384 0.770 0.498 0.718 0.992 0.380 0.777
  1  3 0.482 0.600 0.494 0.186 0.827 0.668 0.794 0.108 0.724 0.411
  2  1 0.935 0.212 0.652 0.126 0.267 0.386 0.013 0.382 0.870 0.340
  2  2 0.821 0.647 0.783 0.553 0.530 0.789 0.023 0.477 0.732 0.693
  2  3 0.478 0.861 0.438 0.245 0.071 0.099 0.316 0.519 0.662 0.407

如何使用data.table或dplyr/tidyr获取它?或任何其他简单选项。

如果我尝试

melt(mydata, id=1)

结果为单列。

我一直在查看官方帮助和小插图,但我只能找到简单得多的示例,只有少量的列,用户手动指定每个列,以及一个模式()的示例,但我无法使其适应我的示例。

其他线程使用GSub,但这让我感到困惑。

我真正想要做的事情稍微复杂一些,但我认为这是第一步(稍后我将再次使用它)。 假设我的列是Mary1、Mary2、Bob1、Bob2、Pam1、Pam2…… 我想创建具有上述每两个不同的新列:mary1-mary2、bob1-bob2、pam1-pam2...

汇总:我不想手写所有列的名称,而是自动选择它们,删除最后一位数字。

PD:好的,我升级我的问题。 它必须不仅适用于A1、A2等名称...但也适用于较长的名称,如

colnames(mydata) <- c("id", paste0(rep(LETTERS[1:10], each=3), rep(LETTERS[1:10], each=3), 1:3)) 

我不介意速度,我在寻找简单的东西,而不是神秘的东西。

推荐答案

使用data.table::melt

require(data.table)
n = unique(gsub("[0-9]+$", "", names(mydata)[-1L]))
p = paste0("^", n)

melt(setDT(mydata), measure=patterns(p), value.name=n, variable.name="N")
#    id N     A     B     C     D     E     F     G     H     I     J
# 1:  1 1 0.266 0.908 0.945 0.062 0.687 0.498 0.380 0.212 0.267 0.382
# 2:  2 1 0.482 0.186 0.794 0.411 0.783 0.789 0.732 0.861 0.071 0.519
# 3:  3 1 0.913 0.332 0.479 0.875 0.347 0.892 0.777 0.713 0.757 0.122
# 4:  1 2 0.372 0.202 0.661 0.206 0.384 0.718 0.777 0.652 0.386 0.870
# 5:  2 2 0.600 0.827 0.108 0.821 0.553 0.023 0.693 0.438 0.099 0.662
# 6:  3 2 0.294 0.651 0.766 0.339 0.334 0.864 0.961 0.400 0.203 0.245
# 7:  1 3 0.573 0.898 0.629 0.177 0.770 0.992 0.935 0.126 0.013 0.340
# 8:  2 3 0.494 0.668 0.724 0.647 0.530 0.477 0.478 0.245 0.316 0.407
# 9:  3 3 0.459 0.258 0.084 0.839 0.476 0.390 0.435 0.325 0.711 0.143

这篇关于R,data.table或dplyr,长格式拆分并列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆