【问题标题】:Extract and append data to new datasets in a for loop在 for 循环中提取数据并将其附加到新数据集
【发布时间】:2021-04-04 09:50:18
【问题描述】:

我有(我认为)是一个非常简单的问题,但我不知道该怎么做。我对列表、循环等还很陌生。

我有一个小数据集:

df <- c("one","two","three","four")
df <- as.data.frame(df)
df

我需要遍历这个数据集并创建一个数据集列表,结果如下:

[[1]]
one

[[2]]
one
two

[[3]]
one
two
three

据我所知,这或多或少:

blah <- list()

for(i in 1:3){
  blah[[i]]<- i
}

以后用这个的时候长度是可变的,所以需要循环自动化。否则,我会这样做

one <- df[1,]
two <- df[2,]

list(one, rbind(one, two))

有什么想法吗?

【问题讨论】:

    标签: r list dataframe loops append


    【解决方案1】:

    您可以尝试使用lapply

    result <- lapply(seq(nrow(df)), function(x) df[seq_len(x), , drop = FALSE])
    result
    
    #[[1]]
    #   df
    #1 one
    
    # [[2]]
    #   df
    #1 one
    #2 two
    
    #[[3]]
    #     df
    #1   one
    #2   two
    #3 three
    
    #[[4]]
    #     df
    #1   one
    #2   two
    #3 three
    #4  four
    

    seq(nrow(df)) 在数据中创建从 1 到行数的序列(在本例中为 4)。 function(x) 部分被称为匿名函数,其中从 1 到 4 的每个值都被一一传递。 seq_len(x) 创建从 1 到 x 的序列,即在第一次迭代中为 1 到 1,在第二次迭代中为 1 到 2,依此类推。我们使用这个序列来对数据框 (df[seq_len(x), ]) 中的行进行子集化。由于当我们对它进行子集化时数据框只有 1 列,因此它将其更改为向量。为避免这种情况,我们添加drop = FALSE

    【讨论】:

    • 这非常有效。如果我想将另一个数据框中的一行绑定到这些列表中的每一个,我该怎么做?我目前正在使用 purrr::map(result,~rbind(.,row)) 但我猜有更好的方法吗?
    • 这是一个好方法,或者您可以在同一个lapply/map 电话中执行此操作。 result &lt;- lapply(seq(nrow(df)), function(x) rbind(df[seq_len(x), , drop = FALSE], row))
    • 啊,完美。我刚刚开始了解 lapply 的工作原理。我尝试在 FALSE] 之后将 ,rbind(df,row) 添加到该函数的末尾,但它没有用。我想我现在开始更好地理解这些功能。谢谢!
    • 如果你不介意,你能解释一下为什么这个函数有效吗:function(x) df[seq_len(x), , drop = FALSE]
    • 我添加了一些关于代码如何工作的解释。我希望这会有所帮助。
    【解决方案2】:

    基础 R 解决方案:

    # Coerce df vector of data.frame to character, store as new data.frame: str_df => data.frame 
    str_df <- transform(df, df = as.character(df))
    
    # Allocate some memory in order to split data into a list:  df_list => empty list
    df_list <- vector("list", nrow(str_df))
    
    # Split the string version of the data.frame into a list as required: 
    # df_list => list of character vectors
    df_list <- lapply(seq_len(nrow(str_df)), function(i){
        str_df[if(i == 1){1}else{1:i}, grep("df", names(str_df))]
      }
    )
    

    数据:

    df <- c("one","two","three","four")
    df <- as.data.frame(df)
    df
    

    【讨论】:

    • 我实际上有点挣扎,因为我的数据比一、二、三更复杂。例如,其中一行数据包括“x+y=2”。当我将它转换为“作为角色”时,它以一种奇怪的方式连接起来,例如"c(\"x+y=2\", \"x+y=3\")".
    • 没关系,只需要选择变量名,例如,df$V1。谢谢!
    • @missgwolf 不用担心,如果它满足了您的要求,请接受我的回答!
    猜你喜欢
    • 2017-10-21
    • 2015-04-05
    • 2016-01-31
    • 2020-08-27
    • 2016-12-19
    • 2021-12-06
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多