R 通过数据帧迭代地追加或绑定列
我有一个900列的数据框。我想使用tidyverse以三的倍数(或其他数字)追加/绑定列。例如,将列2:3追加到1;对于整个数据帧,列5:6到4、列8:9到7等等。因此,在最后我将有300列,同时保留主列的名称(其他列已附加到主列)R 通过数据帧迭代地追加或绑定列,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我有一个900列的数据框。我想使用tidyverse以三的倍数(或其他数字)追加/绑定列。例如,将列2:3追加到1;对于整个数据帧,列5:6到4、列8:9到7等等。因此,在最后我将有300列,同时保留主列的名称(其他列已附加到主列) 我该怎么做?非常感谢:)Atidyverse方法: library(tidyverse) # data df = data.frame(matrix(1:27, ncol=9)) names(df) <- paste('Int', rep(1:3, each=
我该怎么做?非常感谢:)A
tidyverse
方法:
library(tidyverse)
# data
df = data.frame(matrix(1:27, ncol=9))
names(df) <- paste('Int', rep(1:3, each=3), 'A', rep(1:3, 3), sep='_')
n = 3
df %>%
# split the data frame into three data frames
split.default(rep(1:n, ncol(df) / n)) %>%
# rename and row bind the three data frames together
map_df(
~ set_names(.x, names(df)[c(T, rep(F, n - 1))]) %>%
tibble::rownames_to_column('gene')
)
# gene Int_1_A_1 Int_2_A_1 Int_3_A_1
#1 1 1 10 19
#2 2 2 11 20
#3 3 3 12 21
#4 1 4 13 22
#5 2 5 14 23
#6 3 6 15 24
#7 1 7 16 25
#8 2 8 17 26
#9 3 9 18 27
要保留名称,可以使用
data.table::melt
:
library(data.table)
样本数据:
df=data.frame(矩阵(1:27,ncol=9))
名称(df)Atidyverse
approach:
library(tidyverse)
# data
df = data.frame(matrix(1:27, ncol=9))
names(df) <- paste('Int', rep(1:3, each=3), 'A', rep(1:3, 3), sep='_')
n = 3
df %>%
# split the data frame into three data frames
split.default(rep(1:n, ncol(df) / n)) %>%
# rename and row bind the three data frames together
map_df(
~ set_names(.x, names(df)[c(T, rep(F, n - 1))]) %>%
tibble::rownames_to_column('gene')
)
# gene Int_1_A_1 Int_2_A_1 Int_3_A_1
#1 1 1 10 19
#2 2 2 11 20
#3 3 3 12 21
#4 1 4 13 22
#5 2 5 14 23
#6 3 6 15 24
#7 1 7 16 25
#8 2 8 17 26
#9 3 9 18 27
要保留名称,可以使用data.table::melt
:
library(data.table)
样本数据:
df=data.frame(矩阵(1:27,ncol=9))
命名(df)基本R解决方案:
df <- head(mtcars)[-1:-2] # 9 cols
df[(seq(df)-1) %% 3 == 0] <-
lapply(split(seq(df), (seq(df)-1) %/% 3),
function(x) apply(df[x], 1, paste, collapse="_"))
df <- df[(seq(df)-1) %% 3 == 0]
df
# disp wt am
# Mazda RX4 160_110_3.9 2.62_16.46_0 1_4_4
# Mazda RX4 Wag 160_110_3.9 2.875_17.02_0 1_4_4
# Datsun 710 108_93_3.85 2.32_18.61_1 1_4_1
# Hornet 4 Drive 258_110_3.08 3.215_19.44_1 0_3_1
# Hornet Sportabout 360_175_3.15 3.44_17.02_0 0_3_2
# Valiant 225_105_2.76 3.46_20.22_1 0_3_1
dfA基本R解决方案:
df <- head(mtcars)[-1:-2] # 9 cols
df[(seq(df)-1) %% 3 == 0] <-
lapply(split(seq(df), (seq(df)-1) %/% 3),
function(x) apply(df[x], 1, paste, collapse="_"))
df <- df[(seq(df)-1) %% 3 == 0]
df
# disp wt am
# Mazda RX4 160_110_3.9 2.62_16.46_0 1_4_4
# Mazda RX4 Wag 160_110_3.9 2.875_17.02_0 1_4_4
# Datsun 710 108_93_3.85 2.32_18.61_1 1_4_1
# Hornet 4 Drive 258_110_3.08 3.215_19.44_1 0_3_1
# Hornet Sportabout 360_175_3.15 3.44_17.02_0 0_3_2
# Valiant 225_105_2.76 3.46_20.22_1 0_3_1
df可以使用tidyr::unite
和tidyr::separate_rows
实现解决方案。方法是首先将列合并在3组中,然后使用tidyr::separate_rows
函数扩展行中的列
我在他的回答中引用了由@Psidom
创建的数据。另外,我应该提到基于data.table::melt
的方法最适合解决这个问题。但人们可以用不同的方法探索不同的想法
library(tidyverse)
# data
df = data.frame(matrix(1:27, ncol=9))
names(df) <- paste('Int', rep(1:3, each=3), 'A', rep(1:3, 3), sep='_')
lapply(split(names(df),cut(1:ncol(df),3, labels = seq_len(ncol(df) / 3))),
function(x){unite_(df[,x], paste(x[1],x[3], sep = ":"), x, sep = ",",
remove = TRUE)}) %>%
bind_cols() %>%
separate_rows(., seq_len(ncol(.)), sep = ",")
# Int_1_A_1:Int_1_A_3 Int_2_A_1:Int_2_A_3 Int_3_A_1:Int_3_A_3
# 1 1 10 19
# 2 4 13 22
# 3 7 16 25
# 4 2 11 20
# 5 5 14 23
# 6 8 17 26
# 7 3 12 21
# 8 6 15 24
# 9 9 18 27
库(tidyverse)
#资料
df=数据帧(矩阵(1:27,ncol=9))
姓名(df)%
绑定列()%>%
单独的行(,序号(ncol(.),sep=“,”)
#Int_1_A_1:Int_1_A_3 Int_2_A_1:Int_2_A_3 Int_3_A_1:Int_3_A_3
# 1 1 10 19
# 2 4 13 22
# 3 7 16 25
# 4 2 11 20
# 5 5 14 23
# 6 8 17 26
# 7 3 12 21
# 8 6 15 24
# 9 9 18 27
可以使用tidyr::unite
和tidyr::separate_行
实现解决方案。方法是首先将列合并在3组中,然后使用tidyr::separate_rows
函数扩展行中的列
我在他的回答中引用了由@Psidom
创建的数据。另外,我应该提到基于data.table::melt
的方法最适合解决这个问题。但人们可以用不同的方法探索不同的想法
library(tidyverse)
# data
df = data.frame(matrix(1:27, ncol=9))
names(df) <- paste('Int', rep(1:3, each=3), 'A', rep(1:3, 3), sep='_')
lapply(split(names(df),cut(1:ncol(df),3, labels = seq_len(ncol(df) / 3))),
function(x){unite_(df[,x], paste(x[1],x[3], sep = ":"), x, sep = ",",
remove = TRUE)}) %>%
bind_cols() %>%
separate_rows(., seq_len(ncol(.)), sep = ",")
# Int_1_A_1:Int_1_A_3 Int_2_A_1:Int_2_A_3 Int_3_A_1:Int_3_A_3
# 1 1 10 19
# 2 4 13 22
# 3 7 16 25
# 4 2 11 20
# 5 5 14 23
# 6 8 17 26
# 7 3 12 21
# 8 6 15 24
# 9 9 18 27
库(tidyverse)
#资料
df=数据帧(矩阵(1:27,ncol=9))
姓名(df)%
绑定列()%>%
单独的行(,序号(ncol(.),sep=“,”)
#Int_1_A_1:Int_1_A_3 Int_2_A_1:Int_2_A_3 Int_3_A_1:Int_3_A_3
# 1 1 10 19
# 2 4 13 22
# 3 7 16 25
# 4 2 11 20
# 5 5 14 23
# 6 8 17 26
# 7 3 12 21
# 8 6 15 24
# 9 9 18 27
要在1中串联3列的字符吗?要在1中串联3列的字符吗?非常感谢。非常优雅且易于遵循的解决方案。我们能保留行名吗?另外,如果“top”列的列名可以保持原样就好了。谢谢。您的数据框最初是如何命名的?如果要保留原始名称中的信息,可能需要重塑/melt/dcast
。列名如下:Int_1_A_1、Int_1_A_2、Int_1_A_3、Int_2_A_1、Int_2_A_2、Int_2_A_3、Int_3_A_3,等等。。。所以,在rowbind之后,我将有Int_1_A_1,Int_2_A_1,Int_3_A_1,等等。再次感谢你。我遵循你的整洁方式。代码漂亮地保留了我想要的列名,但仍然没有得到行名。我的行名实际上是基因名,我想保留它们。谢谢,你能给我解释一下地图上的名字吗?(~set_names(.x,names(df)[c(T,rep(F,n-1))))非常感谢。非常优雅且易于遵循的解决方案。我们能保留行名吗?另外,如果“top”列的列名可以保持原样就好了。谢谢。您的数据框最初是如何命名的?如果要保留原始名称中的信息,可能需要重塑/melt/dcast
。列名如下:Int_1_A_1、Int_1_A_2、Int_1_A_3、Int_2_A_1、Int_2_A_2、Int_2_A_3、Int_3_A_3,等等。。。所以,在rowbind之后,我将有Int_1_A_1,Int_2_A_1,Int_3_A_1,等等。再次感谢你。我遵循你的整洁方式。代码漂亮地保留了我想要的列名,但仍然没有得到行名。我的行名实际上是基因名,我想保留它们。谢谢你,你能解释一下地图上的名字吗?(~set_names(.x,names(df)[c(T,rep(F,n-1))))谢谢。这将连接列,而不是绑定行!这不是我想要的。@Psidom的解决方案几乎完美,只是它删除了行名称,很不幸。当我面前有一台计算机时,我会编辑,这很容易修复谢谢。这将连接列,而不是绑定行!这不是我想要的。@Psidom的解决方案几乎完美,只是它删除了行名,不幸的是。当我面前有一台计算机时,我会编辑,这很容易修复