将列值取到另一行并使其成为新列
Take column value to another row and make it a new column
我有一个数据集,其中包含一个 id 变量、一个合作伙伴 id 变量和一个值。换句话说,每个观察都与另一个观察配对。我想创建一个新变量,它采用一个伙伴的值并将其添加为一个新列。
下面我有一个示例数据:
set.seed(123)
df <- data.frame(id = c(1:10),
partner_id = c(6,7,8,9,10,1,2,3,4,5),
value = runif(10))
df
id partner_id value
1 1 6 0.2875775
2 2 7 0.7883051
3 3 8 0.4089769
4 4 9 0.8830174
5 5 10 0.9404673
6 6 1 0.0455565
7 7 2 0.5281055
8 8 3 0.8924190
9 9 4 0.5514350
10 10 5 0.4566147
正如我上面所说的,我想添加一个与合作伙伴的 (partner_id
) value
的变量。例如,id == 1
的观察值有 partner_id == 6
,因此,我想要一个新的第四列 (partner_value
),其中 id == 1
有 partner_value == 0.0455565
.
所以最终结果应该是这样的:
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
谢谢!
你可以使用
library(dplyr)
df %>%
left_join(df,
by = c("id" = "partner_id")) %>%
select(id, partner_id, value = value.x, partner_value = value.y)
这个returns
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
来自 match
、
df %>%
mutate(partner_value = value[match(partner_id, id)])
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
在基数 R 中:
df <- merge(df, df[-1], by.x = "id", by.y = "partner_id")
names(df) <- c("id", "partner_id", "value", "partner_value")
我有一个数据集,其中包含一个 id 变量、一个合作伙伴 id 变量和一个值。换句话说,每个观察都与另一个观察配对。我想创建一个新变量,它采用一个伙伴的值并将其添加为一个新列。
下面我有一个示例数据:
set.seed(123)
df <- data.frame(id = c(1:10),
partner_id = c(6,7,8,9,10,1,2,3,4,5),
value = runif(10))
df
id partner_id value
1 1 6 0.2875775
2 2 7 0.7883051
3 3 8 0.4089769
4 4 9 0.8830174
5 5 10 0.9404673
6 6 1 0.0455565
7 7 2 0.5281055
8 8 3 0.8924190
9 9 4 0.5514350
10 10 5 0.4566147
正如我上面所说的,我想添加一个与合作伙伴的 (partner_id
) value
的变量。例如,id == 1
的观察值有 partner_id == 6
,因此,我想要一个新的第四列 (partner_value
),其中 id == 1
有 partner_value == 0.0455565
.
所以最终结果应该是这样的:
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
谢谢!
你可以使用
library(dplyr)
df %>%
left_join(df,
by = c("id" = "partner_id")) %>%
select(id, partner_id, value = value.x, partner_value = value.y)
这个returns
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
来自 match
、
df %>%
mutate(partner_value = value[match(partner_id, id)])
id partner_id value partner_value
1 1 6 0.2875775 0.0455565
2 2 7 0.7883051 0.5281055
3 3 8 0.4089769 0.8924190
4 4 9 0.8830174 0.5514350
5 5 10 0.9404673 0.4566147
6 6 1 0.0455565 0.2875775
7 7 2 0.5281055 0.7883051
8 8 3 0.8924190 0.4089769
9 9 4 0.5514350 0.8830174
10 10 5 0.4566147 0.9404673
在基数 R 中:
df <- merge(df, df[-1], by.x = "id", by.y = "partner_id")
names(df) <- c("id", "partner_id", "value", "partner_value")