我有两个数据帧- df "A“有唯一的列名;df "B”有这些来自"A“的唯一列名所属的组。例如:
> A
ID1 ID2 ID3 ID4 ID5 ID6
1 0.5 0.2 0.0 0.6 0.8 0.2
2 0.1 0.3 0.1 0.4 0.0 0.4
3 1.2 1.1 1.4 1.5 1.9 1.3
4 1.1 1.3 1.5 1.9 1.0 1.1
> B
ID Group
ID1 Grp1
ID2 Grp2
ID3 Grp1
ID4 Grp1
ID5 Grp2
ID6 Grp2 我正在尝试转换"A“的列名,以便它们反映组名,而不是唯一的ID。但是,当我执行此转换时,R会自动添加.1、.2、..列名的后缀,这阻碍了我的下游分析。
下面是我的代码:
names = colnames(A)
colnames(A) <- as.character(B$Group[match(colnames(A),B$ID)])
counts = table(colnames(A))
to_keep = names(counts)[counts >= 1]
pData <- B[B$Group %in% to_keep,]
to_keep = which(colnames(A) %in% to_keep)
A <- A[,to_keep]
names <- names[to_keep]让我知道如何解决这个问题!
谢谢!
编辑:感谢大家的帮助!在您的帮助下,我设法获得了非唯一的列名。我将在这里解释我的用例,这样您可能会理解我为什么要这样做。
我有一个df "A“,这样一些列属于grp1,一些列属于grp2。我希望能够生成用于训练算法的训练集。这个集合是通过随机抽取其中一些组并将它们混合而创建的。其代码如下所示:
names(A) <- B$Group[match(names(A), B$ID)]
counts = table(colnames(A))
training <- as.numeric(unlist(sapply(unique(colnames(A)), function(x) {
sample(which(colnames(A) %in% x), counts[x]/2) })))对于这种用例,欢迎使用任何替代方法。
谢谢!
发布于 2021-02-07 18:02:49
也许是这个?
names(A) = setNames(B$Group, B$ID)[names(A)]这是基于这样的假设:您希望A中名为"ID1“的列变为名为"Grp1”的列,依此类推。
我将保留这一点,因为这是另一个答案的不同方法,但我也同意使用非唯一名称不是一种好的做法。
发布于 2021-02-07 18:05:59
您可以使用match:
names(A) <- B$Group[match(names(A), B$ID)]
A
# Grp1 Grp2 Grp1 Grp1 Grp2 Grp2
#1 0.5 0.2 0.0 0.6 0.8 0.2
#2 0.1 0.3 0.1 0.4 0.0 0.4
#3 1.2 1.1 1.4 1.5 1.9 1.3
#4 1.1 1.3 1.5 1.9 1.0 1.1但是,使用重复的列名并不是一个好的做法。您可以添加一些前缀/后缀来区分列名。是否可以将原始列名附加到组名?
names(A) <- paste(B$Group[match(names(A), B$ID)], names(A), sep = '_')
A
# Grp1_ID1 Grp2_ID2 Grp1_ID3 Grp1_ID4 Grp2_ID5 Grp2_ID6
#1 0.5 0.2 0.0 0.6 0.8 0.2
#2 0.1 0.3 0.1 0.4 0.0 0.4
#3 1.2 1.1 1.4 1.5 1.9 1.3
#4 1.1 1.3 1.5 1.9 1.0 1.1发布于 2021-02-08 02:14:54
我们还可以使用
library(dplyr)
A <- A %>%
rename_at(vars(B$ID), ~ make.unique(B$Group))-output
A
# Grp1 Grp2 Grp1.1 Grp1.2 Grp2.1 Grp2.2
#1 0.5 0.2 0.0 0.6 0.8 0.2
#2 0.1 0.3 0.1 0.4 0.0 0.4
#3 1.2 1.1 1.4 1.5 1.9 1.3
#4 1.1 1.3 1.5 1.9 1.0 1.1https://stackoverflow.com/questions/66086527
复制相似问题