[英]Multiply column values in one data.frame by column in another data.frame on a condition in R
[英]Add one column below another in a data.frame in 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
的示例,但无法找到如何在我的情况下使用它。
我们可以使用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
你也可以这样做:
df2 <- data.frame(a = c(df[,"a"], df[,"b"]))
您可以使用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
您可以通过以下方式选择a
并将其bind
到b
:
df <- data.frame(a=sample(1:10), b=sample(1:10))
df %>%
select(a) %>%
bind_rows(
df %>%
transmute(a = b)
)
您可以将变量合并为一个
df <- data.frame(a=sample(1:10), b=sample(1:10))
df2 <- data.frame(a = c(df$a, df$b))
您还可以同时使用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)
现在所有三列都组合成一个 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 个字符)一样长
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.