【问题标题】:add one column below another in a data.frame in R在 R 中的 data.frame 中在另一列下方添加一列
【发布时间】:2023-03-10 08:22:01
【问题描述】:

不确定我是否在主题中使用了正确的英文单词来描述我需要什么。

看这个例子

df <- data.frame(a=sample(1:10), b=sample(1:10))
df
    a  b
1   2  9
2   5  8
3  10  1
4   3  7
5   8  4
6   6 10
7   9  5
8   7  6
9   1  3
10  4  2

我想将b 列放在a 下面作为10 个新行。

    a
1   2
2   5
3  10
4   3
5   8
6   6
7   9
8   7
9   1
10  4
11  9
12  8
13  1
14  7
15  4
16 10
17  5
18  6
19  3
20  2

我找到了 rbind 的示例,但不知道如何在我的情况下使用它。

【问题讨论】:

  • rbind 失败,因为它假设您传入的参数是行,因此结果为 2x10。您可以使用 c() 来获得端到端或 20x1 的结果

标签: r


【解决方案1】:

我们可以使用unlist创建一个vector,然后用data.frame包装它来创建一个新的数据集。

d1 <- data.frame(a=unlist(df, use.names = FALSE))
d1
#    a
#1   2
#2   5
#3  10
#4   3
#5   8
#6   6
#7   9
#8   7
#9   1
#10  4
#11  9
#12  8
#13  1
#14  7
#15  4
#16 10
#17  5
#18  6
#19  3
#20  2

【讨论】:

    【解决方案2】:

    你也可以这样做:

    df2 <- data.frame(a = c(df[,"a"], df[,"b"]))
    

    【讨论】:

    • 我如何保留名称/文本。这个把我的文字转换成数字?
    • 嗨!你能更具体一点吗?你的意思是列的名称?如果是,那么重点是要有一个将它们全部结合起来的新列。如果两列之一不是数字,它确实会转换数字。 R 试图找到共同点并将所有内容都转换为它(很可能在您的情况下)。
    • 在我的例子中,两列都是电子邮件地址,所以它们确实有数字和特殊字符。有没有办法指定我只想要字符?
    • 是的,通过使用正则表达式,但这是一个完全不同的问题。看看这里也许stackoverflow.com/questions/25076575/… 或者只是发布一个新问题:)
    【解决方案3】:

    您可以使用tidyr 包中的pivot_longer()

    library(dplyr)
    set.seed(1)
    df <- data.frame(a=sample(1:10), b=sample(1:10))
    pivot_longer(df, a:b)
    
    
    # A tibble: 20 x 2
       name  value
       <chr> <int>
     1 a         3
     2 b         3
     3 a         4
     4 b         2
     5 a         5
     6 b         6
     7 a         7
     8 b        10
     9 a         2
    10 b         5
    11 a         8
    12 b         7
    13 a         9
    14 b         8
    15 a         6
    16 b         4
    17 a        10
    18 b         1
    19 a         1
    20 b         9
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式将abind选择为b

      df <- data.frame(a=sample(1:10), b=sample(1:10))
      df %>% 
        select(a) %>% 
        bind_rows(
          df %>% 
            transmute(a = b)
        )
      

      【讨论】:

        【解决方案5】:

        您还可以同时使用tidyrdplyr 以新的data.frame 结束。

        library(tidyr)
        library(dplyr)
        set.seed(1)
        df <- data.frame(a=sample(1:10), b=sample(11:20), c=sample(21:30))
        head(df)
        
        df2 <- pivot_longer(df, a:c, names_to = "letter", values_to = "d")
        df3 <- data.frame(arrange(df2, letter))
        head(df3); str(df3)
        

        现在所有三列都组合成一个 2 列 30 行的数据框。

        谨慎创建比原始 data.frame 更长的列,因为它们会重复其他列以使整个 data.frame 具有正确的行数。这在一遍又一遍地重复主题时可能是有利的,但在其他情况下可能会出现问题。

        df4 <- pivot_longer(df, c(a,c), names_to = "letter", values_to = "d")
        df5 <- data.frame(arrange(df4, letter))
        head(df5); str(df5)
        df5
        

        注意 R 复制了列 'b' 以使其与其他列一样长(20 个字符)

        【讨论】:

          猜你喜欢
          • 2012-03-27
          • 1970-01-01
          • 1970-01-01
          • 2022-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-29
          相关资源
          最近更新 更多