在R中,根据元素名称(rbind和指示符变量)重新组织列表
我正在尝试重新组织我的数据,基本上是一个data.frames列表。 其元素代表感兴趣的主题(A和B),在x和y上观察,收集了两次(1和2)。 我试图将此列表制作成一个包含data.frames的列表,该列表引用了主题,其中收集x和y时的信息作为新变量存储在相应的data.frames中,而不是元素名称:在R中,根据元素名称(rbind和指示符变量)重新组织列表,r,rbind,R,Rbind,我正在尝试重新组织我的数据,基本上是一个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
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
library('rlist')
A1根据您提供的数据:
subj <- sub("[A-Z]*", "", names(lst))
newlst <- Map(function(x, y) {x[,"class"] <- y;x}, lst, subj)
数据
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)
A1听起来你做了很多体操,因为你脑子里有一个特定的形式。我的建议是,首先尝试制作数据。在不阅读链接的情况下,快速摘要是将数据放入单个数据框中,以便轻松处理
答案的快速版本(这里我使用了lst
而不是list
作为名称,以避免与内置的list
混淆)是这样做的:
do.call(rbind,
lapply(seq(lst), function(i) {
lst[[i]]$type <- names(lst)[i]; lst[[i]]
})
)
do.call(rbind,
lapply(序列(lst),功能(i){
lst[[i]]$type如果您提供一些真实的数据帧名称,有人试图帮助您编写更准确的正则表达式。我认为将正则表达式问题放在一个更抽象的层次上会使我的问题变得更混乱。当然,stackoverflow再次证明了周围有真正有帮助的人。我将在下面处理您的答案并获得帮助back:)只要我的名声不允许投票,我会把我的感谢留在这里。我需要比你们更多的时间来处理你们的答案!
do.call(rbind,
lapply(seq(lst), function(i) {
lst[[i]]$type <- names(lst)[i]; lst[[i]]
})
)
lst <- list(A1=data.frame(x=rnorm(5)), A2=data.frame(x=rnorm(3)), B=data.frame(x=rnorm(5)))
lst
$A1
x
1 1.3386071
2 1.9875317
3 0.4942179
4 -0.1803087
5 0.3094100
$A2
x
1 -0.3388195
2 1.1993115
3 1.9524970
$B
x
1 -0.1317882
2 -0.3383545
3 0.8864144
4 0.9241305
5 -0.8481927
df <- do.call(rbind,
lapply(seq(lst), function(i) {
lst[[i]]$type <- names(lst)[i]; lst[[i]]
})
)
df
x type
1 1.3386071 A1
2 1.9875317 A1
3 0.4942179 A1
4 -0.1803087 A1
5 0.3094100 A1
6 -0.3388195 A2
7 1.1993115 A2
8 1.9524970 A2
9 -0.1317882 B
10 -0.3383545 B
11 0.8864144 B
12 0.9241305 B
13 -0.8481927 B