我有以下使用R创建的列表,
set.seed(326581)
X1=rnorm(10,0,1)
Y1=rnorm(10,0,2)
data=data.frame(X1,Y1)
lst <- replicate(
100,
df.smpl <- data %>% sample_n(10, replace = T),
simplify = FALSE)
此列表代表100个样本,每个样本有2列(X,Y),样本大小为10。
我需要将所有X列分成一个数据帧,将Y列分成一个数据帧。所以最后我应该有2个数据帧,每个数据帧有100列和10行。
我尝试了此循环
new1=c()
new2=c()
for(i in 1:100)
{
new1[i]=lst[[i]]$X
new2[i]=lst[[i]]$Y
}
但是它不起作用。有人可以告诉我找出错误吗?
答案 0 :(得分:2)
这是tidyverse
的一个选项,其中我们transpose
将对象{{1}和{Y1s}分别list
绑定到map
中的列中创建list
个tibble
library(tidyverse)
out <- transpose(lst) %>%
map(bind_cols)
最好将其保存在list
中,但是如果我们要使用单独的对象
outx <- out[[1]]
outy <- out[[2]]
dim(outx)
#[1] 10 100
dim(outy)
#[1] 10 100
或者使用lapply
中的base R
提取
data.frame(lapply(lst, `[`, 'X1'))
data.frame(lapply(lst, `[`, 'Y1'))
答案 1 :(得分:2)
使用do.call
cbind
,将它们合并为一个数据帧,然后我们将其拆分为预期的输出
s=do.call("cbind", lst)
Y=s[,seq(2,200,2)]
X=s[,seq(1,200,2)]