【问题标题】:How to extract values from a list in varying intevals (defined by list)如何以不同的间隔从列表中提取值(由列表定义)
【发布时间】:2019-04-02 11:14:33
【问题描述】:

我想以不同的时间间隔从数据框中的列中提取值。间隔存储在列表中。有没有办法提取这个?

该列如下所示:

6211
6111
711
414  
3211  
3311 
3411  
3511 
6211 
6111
...

还有这样的列表:

"2"  "4"  "2"  "6"  "15" "2"  "9"...

现在我想在 df 的列上应用列表(列表定义了所需值之间的步骤。结果应该作为新变量存储在 df 中。由于缺少值,我们需要填充新的带有 NA 的列。这些应存储在列表中定义的间隔中。

所以结果应该是这样的:


#    X       Y
1   6211    711
2   6111     NA
3    711     NA
4    414    3411
5   3211     NA
....

其中行之间的 NA 的数量再次由向量定义。 在最后一步中,我想将 X 和 Y 粘贴在一起以获得关键变量。

谢谢!

【问题讨论】:

    标签: r list dataframe vector extract


    【解决方案1】:

    我们可以在向量上使用cumsum 并对列进行子集化

    df$x[cumsum(c(1,vec))]
    #[1] 6211  711 3411 6211
    

    或者如果你想要它作为一个列

    df[cumsum(c(1,vec)), ,drop = FALSE]
    

    或者从dplyr使用slice

    library(dplyr)
    df %>%  slice(cumsum(c(1, vec)))
    
    #    x
    #1 6211
    #2  711
    #3 3411
    #4 6211
    

    编辑

    对于更新部分获取新列Y我们可以做

    vals <- df$x[cumsum(c(1,vec))][-1]
    df$y <- NA
    df$y[cumsum(c(1, vec + 1))] <- vals
    

    数据

    df <- data.frame(x = c(6211, 6111, 711, 414,3211,3311, 3411,3511,6211,6111))
    vec <- as.numeric(c("2","4","2"))
    

    【讨论】:

    • 谢谢@RonakShah!这对我来说效果很好。正如您已经提到的,我想将结果存储为一个新变量。现在我得到错误:替换有 21880 行,数据有 361333 这很明显,但是可以将提取的数据存储为新变量并用“NA”填充观察之间的行(再次使用向量)?
    • @copamundial 你打算如何存储它?它的代码是什么?
    • ```` Lines$new
    • 这不起作用,因为您在Lines 中有更多的行数,而此代码将为我们提供小于行数的值。
    • 我尝试了你的第二个建议。 df[cumsum(c(1,vec)), ,drop = FALSE] 我是否需要再次使用 cumsum 将提取的数据分配给正确的行?
    猜你喜欢
    • 2021-11-02
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多