不确定我是否在主题中使用了正确的英语单词来描述我需要的内容。
参见此示例
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
的示例,但在我的情况下无法找到如何使用它。
答案 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)
您还可以同时使用tidyr
和dplyr
以新的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个字符)