gpt4 book ai didi

r - 在 R 中,根据元素名称重组列表(rbind 和指示变量)

转载 作者:行者123 更新时间:2023-12-02 01:33:06 27 4
gpt4 key购买 nike

我正在尝试重新组织我的数据,基本上是一个 data.frames 列表。它的元素代表感兴趣的主题(A 和 B),对 x 和 y 的观察,在两个场合(1 和 2)收集。我试图使这个列表包含指向主题的 data.frames,收集 x 和 y 的信息作为新变量存储在各自的 data.frames 中,而不是元素名称:

library('rlist')

A1 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
A2 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
B1 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
B2 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))

list <- list(A1=A1,A2=A2,B1=B1,B2=B2)

A <- do.call(rbind,list.match(list,"A"))
B <- do.call(rbind,list.match(list,"B"))

list <- list(A=A,B=B)
list <- lapply(list,function(x) {
y <- data.frame(x)
y$class <- c(rep.int(1,2),rep.int(2,2))
return(y)
})

> list
$A
x y class
A1.1 66 96 1
A1.2 76 58 1
A2.1 50 93 2
A2.2 57 12 2

$B
x y class
B1.1 58 56 1
B1.2 69 15 1
B2.1 77 77 2
B2.2 9 9 2

在我的现实世界问题中,有大约 500 个主题,并不总是两次,不同数量的观察。

所以我上面的例子只是为了说明我想到达哪里,我被困在如何传递给 do.call-rbind 它应该基于元素名称,将特定主题的元素绑定(bind)为新的列表元素在一起,同时分配一个新变量。

对我来说,这是一个有点模糊的任务,我得到的最接近的是 rlist 包。 This问题是相关的,但使用 unique 来标识元素,而在我的情况下,它似乎更像是一个正则表达式问题。

即使是有关如何使用 google 的说明、任何用于进一步研究的关键字等,我也会很高兴。

最佳答案

根据您提供的数据:

subj <- sub("[A-Z]*", "", names(lst))
newlst <- Map(function(x, y) {x[,"class"] <- y;x}, lst, subj)

首先我们执行正则表达式调用以隔离将进入 class 的数字柱子。在这种情况下,我匹配大写字母并删除它们留下数字。因此,"A1"变成 "1" .请注意,真实姓名意味着不同的正则表达式模式。

然后我们使用Map为每个数据框创建一个新列并保存到一个名为 newlst 的新列表中. Map 获取每个参数的第一个元素并执行函数,然后继续处理每个对象元素。所以 lst 中的第一个数据框和 subj 中的第一个数字首先使用。我使用的匿名函数是function(x,y) {x[, "class"] <- y; x} .它需要两个参数。第一个是数据框,第二个是列值。

现在前进要容易得多。我们可以创建一个名为 uniq.nmes 的向量获取我们将合并的数据框的名称。在哪里"A1"将变为 "A" .然后我们可以对该匹配进行 rbind:

uniq.nmes <- unique(sub("\\d", "", names(lst)))
lapply(uniq.nmes, function(x) {
do.call(rbind, newlst[grep(x, names(newlst))])
})
# [[1]]
# x y class
# A1.1 1 79 1
# A1.2 30 13 1
# A2.1 90 39 2
# A2.2 43 22 2
#
# [[2]]
# x y class
# B1.1 54 59 1
# B1.2 83 90 1
# B2.1 85 36 2
# B2.2 91 28 2

数据

A1 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
A2 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
B1 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))
B2 <- data.frame(x=sample(1:100,2),y=sample(1:100,2))

lst <- list(A1=A1,A2=A2,B1=B1,B2=B2)

关于r - 在 R 中,根据元素名称重组列表(rbind 和指示变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32971132/

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