在R中的data.frame中添加一列在另一列之下

时间:2016-11-27 15:56:37

标签: r

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

参见此示例

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的示例,但在我的情况下无法找到如何使用它。

5 个答案:

答案 0 :(得分:5)

我们可以使用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

答案 1 :(得分:2)

你也可以这样做:

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

答案 2 :(得分:0)

您可以通过以下方式选择a并将其bind选为b

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

答案 3 :(得分:0)

您可以使用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 :(得分:0)

您还可以同时使用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)

现在,所有三列都合并为一个具有30行的2列数据框。

请谨慎创建比原始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个字符)