【问题标题】:Access several elements from list based on the indexes stored in another list根据存储在另一个列表中的索引访问列表中的多个元素
【发布时间】:2018-11-28 15:09:58
【问题描述】:

我要做的是从包含列表的数据框列中提取元素,想象列 df$A 有 3 行,每行包含列表:

c(111, 222, 333)
c(444, 555, 666)
c(777, 888, 999)

(列表从 1 到 230 个元素不等)

df$B 列存储元素的某些位置:

1
c(1, 2)
c(1, 2, 3)

我的目标是根据存储在列 df$A 中的索引从列 df$B 中提取列 df$C 元素,因此列 df$C 看起来像

111
c(444, 555)
c(777, 888, 999)

我已经尝试过 unlist、sapply、mutate 的不同组合,用向量访问列表元素,比如

df$A[nrow][[c(df$B)]]

等等,但我不断遇到不同的错误,并没有接近预期的结果。

最后,我想要实现的是对列表中某个位置的每一行中的整数求和,因此潜在的 df$D 可能看起来像

111
999
2664

我担心也许我的整个方法都是错误的,我正在强迫 R 以一种不符合设计的方式行事,但到目前为止,我通常设法为我问自己的每个问题得到正确的答案。

【问题讨论】:

    标签: r


    【解决方案1】:

    不确定整个 data.frame 是否包含列表的东西:

    数据:(虽然不推荐)只使用两个列表(l1l2

    df1 <- data.frame(A = 1:3)
    
    df1$A <- list(c(111, 222, 333),
                  c(444, 555, 666),
                  c(777, 888, 999))
    
    df1$B <- list(1,
                  c(1, 2),
                  c(1, 2, 3))
    

    代码:?mapply 的时间到了。

    #df1$D <-
    mapply(function(vals, inds) {sum(vals[inds])}, vals = df1$A, inds = df1$B)
    

    结果:

    #[1]  111  999 2664
    

    【讨论】:

    • 这似乎是我一直在寻找的解决方案 - 我会在处理我的问题后立即标记它,由于使用 strsplit 我的整数被存储为字符串(还没有当我专注于任务的按索引获取元素部分时给予了足够的关注),所以显然我无法总结它们。不过,我很感谢你的帮助,我希望有一天我能达到你在 R 中提出的那种水平的思考。
    • 好的,lapply(strsplit( ... ), as.numeric) 帮助我将存储为字符串的整数转换为整数,然后您的解决方案按预期工作。非常感谢您的帮助!
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多