Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过数据帧迭代地追加或绑定列_R_Dataframe_Dplyr_Tidyr - Fatal编程技术网

R 通过数据帧迭代地追加或绑定列

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=

我有一个900列的数据框。我想使用tidyverse以三的倍数(或其他数字)追加/绑定列。例如,将列2:3追加到1;对于整个数据帧,列5:6到4、列8:9到7等等。因此,在最后我将有300列,同时保留主列的名称(其他列已附加到主列)


我该怎么做?非常感谢:)

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)A
tidyverse
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的解决方案几乎完美,只是它删除了行名,不幸的是。当我面前有一台计算机时,我会编辑,这很容易修复