gpt4 book ai didi

r - 在 R - 从 data.frame 中的所有行生成成对 data.frame

转载 作者:行者123 更新时间:2023-12-01 01:47:59 25 4
gpt4 key购买 nike

我有一个名为 df 的 data.frame在 4 列上有 800 万个观察值:

name <- c("Pablo", "Christina", "Steve", "Diego", "Ali", "Brit", "Ruth", "Mia", "David", "Dylan")
year <- seq(2000, 2009, 1)
v1 <- sample(1:10, 10, replace=T)
v2 <- sample(1:10, 10, replace=T)
df <- data.frame(year, v1)

> df
name year v1 v2
1 Pablo 2000 2 9
2 Christina 2001 5 3
3 Steve 2002 8 9
4 Diego 2003 7 6
5 Ali 2004 2 4
6 Brit 2005 1 1
7 Ruth 2006 10 9
8 Mia 2007 6 7
9 David 2008 10 9
10 Dylan 2009 3 2

我想生成一个 data.frame outputdf 中行的所有成对组合看起来像这样:
 >output
name year v1 v2 name_2 year_2 v1_2 v2_2
1 Pablo 2000 2 9 Christina 2001 5 3
2 Pablo 2000 2 9 Steve 2002 8 9
3 Pablo 2000 2 9 Diego 2003 7 6
etc.

什么是最快的方法来做到这一点?

最佳答案

tidyr::crossing将返回观察的所有组合,但您需要使用 setNames 设置名称或类似。如果你不想要自匹配,你可以通过调用 dplyr::filter 删除它们。在任何唯一 ID 列上。

library(tidyverse)

df_crossed <- df %>%
setNames(paste0(names(.), '_2')) %>%
crossing(df) %>%
filter(name != name_2)

head(df_crossed)
## name_2 year_2 v1_2 v2_2 name year v1 v2
## 1 Pablo 2000 5 5 Christina 2001 7 3
## 2 Pablo 2000 5 5 Steve 2002 1 9
## 3 Pablo 2000 5 5 Diego 2003 2 8
## 4 Pablo 2000 5 5 Ali 2004 9 5
## 5 Pablo 2000 5 5 Brit 2005 8 5
## 6 Pablo 2000 5 5 Ruth 2006 8 1

另一种修复名称的方法是使用 janitor::clean_namescrossing ,虽然它是一个额外的包。

关于r - 在 R - 从 data.frame 中的所有行生成成对 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com