【问题标题】:Vectors of different lengths from a `for` cycle in R: merging in a data frame [duplicate]R中“for”循环中不同长度的向量:合并到数据框中[重复]
【发布时间】:2013-08-20 12:40:15
【问题描述】:

我在 R 中有以下基本问题。

我有一个for (k in 1:x){...} 循环,它产生长度取决于k 的数值向量。 对于k 的每个值,我生成一个数字向量。

如果可能,我想将它们收集为 R 中的数据框行。也就是说,我想介绍一个数据框datas.t.

    for (k in 1:x) {
            data[k,] <- ...      
                     }

其中的点表示生成向量的命令,该向量的长度取决于k

不幸的是,据我所知,R 中数据帧的行长度是恒定的,因为它是等长向量的列表。我已经尝试用适当数量的零来完成每一行以达到恒定长度(在这种情况下等于x)。相反,我想“动态地”工作。

我不认为这个问题等同于在一个数据框中合并不同长度的向量;由于if 循环,每一步只知道一个向量。

编辑

我的意思的一个非常简单的例子。对于每个k,我想编写其分量为1,2,...,k 的向量并将其存储为数据帧data 的第k 行。在上面的设置中,我会写

 for (k in 1:x) {
                data[k,] <- seq(1,k,1)     
                         }

由于seq(1,k,1) 的长度取决于k,因此代码不起作用。

【问题讨论】:

  • 您能举一个简单的例子来说明您想要实现的目标吗?问题的措辞有点令人困惑,我不确定您所说的if 循环是什么意思:I do not think that this issue is equivalent to merge vectors of different lengths in a dataframe; due to the "if" cycle, only 1 vector is known at each step。您是指一些ifelse() 声明吗?我在您的代码中没有看到任何内容。
  • 好的,我会相应地编辑问题!感谢您的反馈。

标签: r for-loop dataframe


【解决方案1】:

您可以考虑在此处使用plyr 中的ldply

set.seed(123)
#k is the length of each result
k <- sample( 5 , 3 , repl = TRUE )
#[1] 2 4 3


# Make a list of vectors, each a sequence from 1:k
ll <- lapply( k , function(x) seq_len(x) )
#[[1]]
#[1] 1 2

#[[2]]
#[1] 1 2 3 4

#[[3]]
#[1] 1 2 3

# take our list and rbind it into a data.frame, filling in missing values with NA
ldply( ll , rbind)
#  1 2  3  4
#1 1 2 NA NA
#2 1 2  3  4
#3 1 2  3 NA

【讨论】:

  • 如果他希望向量成为数据帧的rows,我认为我们不需要对最终结果进行转置。这个ldply( ll , rbind) 应该这样做。
  • @Mariam 谢谢。我编辑了。
  • 顺便说一句,代码非常简洁。
  • 我明白了:使用列表一可以避免维度灾难:-)。很有帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2015-07-25
  • 2015-04-04
相关资源
最近更新 更多