R 来自向量列表的数据帧
我有4个不同长度的向量(d1,d2,d3,d4),从中我创建了一个像这样的数据帧R 来自向量列表的数据帧,r,dataframe,R,Dataframe,我有4个不同长度的向量(d1,d2,d3,d4),从中我创建了一个像这样的数据帧 df <- data.frame( x = c( seq_along(d1), seq_along(d2), seq_along(d3), seq_along(d4) ), y = c( d1, d2, d3, d4 ), id = c( rep("d1", times = length(d1)),
df <- data.frame(
x = c(
seq_along(d1),
seq_along(d2),
seq_along(d3),
seq_along(d4)
),
y = c(
d1,
d2,
d3,
d4
),
id = c(
rep("d1", times = length(d1)),
rep("d2", times = length(d2)),
rep("d3", times = length(d3)),
rep("d4", times = length(d4))
))
但我正在努力解决第二部分的问题,这可能与本文(伪代码)的思路类似
df您可以定义采用任意数量向量的函数:
build_df 3 d1
#>416D2
#>527D2
#>6 3 8 d2
#>7 4 9 d2
#>814个香蕉
#>9.25香蕉
#>10 3 6香蕉
由(v0.3.0)于2020-08-03创建的您的y
可以通过未列出的轻松组装。我需要一个for
循环来生成x
和id
。这个功能怎么样
d1 <- pnorm(seq(-2, 2, 0.05))-3
d2 <- pnorm(seq(-3, 3, 0.10))
d3 <- pnorm(seq(-1, 2, 0.05))-4
d4 <- pnorm(seq(-4, 3, 0.15))
my_list <- list(d1 = d1, d2 = d2, d3 = d3, d4 = d4)
build_df <- function(list) {
names <- names(list)
x <- integer()
id <- character()
for(i in 1:length(list)) {
x <- c(x, seq_along(list[[i]]))
id <- c(id, rep(names[i], length(list[[i]])))
}
y <- unname(unlist(list))
df <- data.frame(x = x, y = y, id = id)
return(df)
}
df <- build_df(my_list)
head(df)
x y id
1 1 -2.977250 d1
2 2 -2.974412 d1
3 3 -2.971283 d1
4 4 -2.967843 d1
5 5 -2.964070 d1
6 6 -2.959941 d1
d1我们可以使用mget
library(dplyr)
library(tibble)
library(tidyr)
library(data.table)
mget(paste0("d", 1:4)) %>%
enframe(name = 'id', value = 'y') %>%
unnest(c(y)) %>%
mutate(x = rowid(id))
你能分享一个向量样本吗?它们都是跛脚的长度吗?@Sotos它们的长度不同。我添加了更多的细节。这个答案已经非常好了。谢谢只有“d”+i
不是那么理想。我希望能够单独命名它们…或者将它们的名称作为变量之一-但我怀疑这是可能的。@tcurdt看不到我的更新。可以将其作为变量的名称,但如果传递的是表达式而不是变量名称,则可能会出现问题
d1 <- pnorm(seq(-2, 2, 0.05))-3
d2 <- pnorm(seq(-3, 3, 0.10))
d3 <- pnorm(seq(-1, 2, 0.05))-4
d4 <- pnorm(seq(-4, 3, 0.15))
d1 <- pnorm(seq(-2, 2, 0.05))-3
d2 <- pnorm(seq(-3, 3, 0.10))
d3 <- pnorm(seq(-1, 2, 0.05))-4
d4 <- pnorm(seq(-4, 3, 0.15))
my_list <- list(d1 = d1, d2 = d2, d3 = d3, d4 = d4)
build_df <- function(list) {
names <- names(list)
x <- integer()
id <- character()
for(i in 1:length(list)) {
x <- c(x, seq_along(list[[i]]))
id <- c(id, rep(names[i], length(list[[i]])))
}
y <- unname(unlist(list))
df <- data.frame(x = x, y = y, id = id)
return(df)
}
df <- build_df(my_list)
head(df)
x y id
1 1 -2.977250 d1
2 2 -2.974412 d1
3 3 -2.971283 d1
4 4 -2.967843 d1
5 5 -2.964070 d1
6 6 -2.959941 d1
library(dplyr)
library(tibble)
library(tidyr)
library(data.table)
mget(paste0("d", 1:4)) %>%
enframe(name = 'id', value = 'y') %>%
unnest(c(y)) %>%
mutate(x = rowid(id))