【问题标题】:Create dataframe in R based on position from a grouped list根据分组列表中的位置在 R 中创建数据框
【发布时间】:2021-03-17 11:32:05
【问题描述】:

我一直在尝试根据存储在列表中的位置(按 id 分组)从数据框中提取值。具体来说,在以下可重现的示例中,我有一个列表 (l1),其中包含数据帧 (df) 的某些行位置,按 id 分组。

id1 <- c(1,1,1,1,1,1,1,1,1,2,2)
ind1 <- c(1,3,5,8,9,10,12,14,17,1,3)
l1<-list(id1,ind1)

id <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2)
v2 <- c(5,6,1,2,4,5,8,9,12,12,2,3,6,7,8,1,9,4,19,2,5,6,3,4,9)

df<- data.frame(id,v2)

我想创建一个新的数据框,其中变量 v2 的值位于 l1 中指定的位置。期望的输出:

v3 <- c(5,1,4,9,12,12,3,7,9,5,3)
id2 <- c(1,1,1,1,1,1,1,1,1,2,2)

output <- data.frame(v3,id2)

我对如何解决这个问题有点迷茫,我试过了:

output <- group_by(id) %>% df[nrow(v2)==nrow(l1),]

但我收到错误消息:

UseMethod("group_by_") 中的错误:没有适用的方法 'group_by_' 应用于“c('double', 'numeric')”类的对象

有什么想法吗?

【问题讨论】:

    标签: r list dataframe group-by


    【解决方案1】:

    您可以在mapply 中使用whichdf 中获取所需的索引。

    data.frame(v3 = df$v2[mapply(function(i, j) which(i == df$id)[j],
     l1[[1]], l1[[2]])], id2 = l1[[1]])
    #   v3 id2
    #1   5   1
    #2   1   1
    #3   4   1
    #4   9   1
    #5  12   1
    #6  12   1
    #7   3   1
    #8   7   1
    #9   9   1
    #10  5   2
    #11  3   2
    

    【讨论】:

    • 非常感谢您的回复,它成功了。我想知道,如果我有一个非常长的嵌套列表,有没有办法在不手动包含每个索引的情况下修改它? ( l1[[1]], l1[[2]] ...等)
    • 也许你给一个例子数据来展示这个案例,也许在一个新问题中。
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2018-04-17
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多