将列表中的成对因素拉入 R 中的 2 列数据框
Pulling Pairs of Factors from a within a list into a 2-column dataframe in R
我是 r 的新手,我正在尝试将列表中并排的成对因子放入数据框中,以便我可以将它们导出为 GEPHI 的边。我正在尝试创建一个数据集,该数据集就像每个用户旅程的购物清单,其中每个边缘都是从一个购物点到另一个购物点的旅程。
这是我正在测试的示例数据:
a <- c("a","a","a","b","b","a","a","b","a","a","c","d","c")
b <- c(12,22,44,22,33,55,33,66,88,55,33,66,77)
a1 <- data.frame(a,b)
b1 <- tapply(a1$b, a1$a, list)
看起来像这样:
$a
[1] 12 22 44 55 33 88 55
$b
[1] 22 33 66
$c
[1] 33 77
$d
[1] 66
因此,“$a、$b、$c、$d”将是个人用户,其中的列表将是交易旅程。我希望第一行是“12 22”,然后第二行是“22 44”……最后一行是“33 77”。
到目前为止,我已经创建了名为 "pairsfunction" 的函数,并尝试使用 lapply 但它似乎不起作用。
这是我目前的情况:
pairingfunction <- function(x) {
pairdf <- data.frame()
for (i in 1:(length(x)-1)){
a <- x[i]
b <- x[(i+1)]
pairdf[(nrows(pairdf)+1)] <- a
pairdf[(nrows(pairdf))] <- b
} return(pairdf)
}
lapply(b1, pairingfunction)
如果有人可以帮助修复该功能或让我知道比使用 lapply 更好的方法,那就太好了。谢谢
您可以移动和绑定列表元素。将其包装在 lapply 中以对列表中的每个元素执行此操作。您可以将其包装在 do.call(rbind, ...)
中以得到矩阵形式。
do.call(rbind, lapply(b1, function(x) cbind(x[-length(x)], x[-1])))
您可以利用 tidyr
包中的 nest()
函数:
library(tidyr)
library(dplyr)
a <- c("a","a","a","b","b","a","a","b","a","a","c","d","c")
b <- c(12,22,44,22,33,55,33,66,88,55,33,66,77)
df <- data.frame(user = a, touchpoint = b)
df %>% nest(touchpoint)
# user data
# 1 a 12, 22, 44, 55, 33, 88, 55
# 2 b 22, 33, 66
# 3 c 33, 77
# 4 d 66
我是 r 的新手,我正在尝试将列表中并排的成对因子放入数据框中,以便我可以将它们导出为 GEPHI 的边。我正在尝试创建一个数据集,该数据集就像每个用户旅程的购物清单,其中每个边缘都是从一个购物点到另一个购物点的旅程。
这是我正在测试的示例数据:
a <- c("a","a","a","b","b","a","a","b","a","a","c","d","c")
b <- c(12,22,44,22,33,55,33,66,88,55,33,66,77)
a1 <- data.frame(a,b)
b1 <- tapply(a1$b, a1$a, list)
看起来像这样:
$a
[1] 12 22 44 55 33 88 55
$b
[1] 22 33 66
$c
[1] 33 77
$d
[1] 66
因此,“$a、$b、$c、$d”将是个人用户,其中的列表将是交易旅程。我希望第一行是“12 22”,然后第二行是“22 44”……最后一行是“33 77”。
到目前为止,我已经创建了名为 "pairsfunction" 的函数,并尝试使用 lapply 但它似乎不起作用。
这是我目前的情况:
pairingfunction <- function(x) {
pairdf <- data.frame()
for (i in 1:(length(x)-1)){
a <- x[i]
b <- x[(i+1)]
pairdf[(nrows(pairdf)+1)] <- a
pairdf[(nrows(pairdf))] <- b
} return(pairdf)
}
lapply(b1, pairingfunction)
如果有人可以帮助修复该功能或让我知道比使用 lapply 更好的方法,那就太好了。谢谢
您可以移动和绑定列表元素。将其包装在 lapply 中以对列表中的每个元素执行此操作。您可以将其包装在 do.call(rbind, ...)
中以得到矩阵形式。
do.call(rbind, lapply(b1, function(x) cbind(x[-length(x)], x[-1])))
您可以利用 tidyr
包中的 nest()
函数:
library(tidyr)
library(dplyr)
a <- c("a","a","a","b","b","a","a","b","a","a","c","d","c")
b <- c(12,22,44,22,33,55,33,66,88,55,33,66,77)
df <- data.frame(user = a, touchpoint = b)
df %>% nest(touchpoint)
# user data
# 1 a 12, 22, 44, 55, 33, 88, 55
# 2 b 22, 33, 66
# 3 c 33, 77
# 4 d 66