R 来自向量列表的数据帧

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)),

我有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)), 
    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))