【问题标题】:R - Apply a function to specific column in a list of similar data.framesR - 将函数应用于类似 data.frames 列表中的特定列
【发布时间】:2023-03-28 02:03:01
【问题描述】:

我正在制作一个 data.frames 列表,如下所示:

simulation_data <- vector( mode = "list", length = length(subgroups_a))

for( A in subgroups_a) { simulation_data[['A']] <- paste0(dbGetQuery(conn, "SELECT a, b, c, date FROM t WHERE a = ", A)) }

一般来说,如何将函数应用于列表中每个 data.frame 中相同的特定列?

我的具体情况是我需要将ymd()应用到simulation_data中每个data.frame的date列。我目前的解决方法是每次在for 循环中更新列,如下所示: simulation_inv[['A']]['dt'] &lt;- ymd(simulation_inv[['A']]['dt']), 但如果可能的话,我想将它矢量化。

我不知道如何使用lapply 来做到这一点,也许有更好的解决方案。

感谢您的帮助。

【问题讨论】:

    标签: r vectorization lapply


    【解决方案1】:

    可能是这样的——

    DT1 = data.frame(A=20130101:20130103,B=letters[1:3])
    DT2 = data.frame(A=20130104:20130105,B=letters[4:5])
    l = list(DT1,DT2)
    
    l2 <- lapply(l, function(x) cbind(x,as.Date(as.character(x$A),'%Y%m%d')))
    

    l 的样子 -

    > l
    [[1]]
             A B
    1 20130101 a
    2 20130102 b
    3 20130103 c
    
    [[2]]
             A B
    1 20130104 d
    2 20130105 e
    

    l2 看起来像 -

    > l2
    [[1]]
             A B as.Date(as.character(x$A), "%Y%m%d")
    1 20130101 a                           2013-01-01
    2 20130102 b                           2013-01-02
    3 20130103 c                           2013-01-03
    
    [[2]]
             A B as.Date(as.character(x$A), "%Y%m%d")
    1 20130104 d                           2013-01-04
    2 20130105 e                           2013-01-05
    

    使用相同的基本方法,您还可以覆盖之前的列,或指定更好的列名等。

    【讨论】:

    • 好的,这是一项重大改进(删除原始列后减少到 2 行代码),但现在我仍然需要删除额外的列。如果可能的话,我真的很想在一条优雅的路线上完成这个过程。
    • 定义“一条优雅的线条”。你可以在lapply 中做任何你想做的事情,例如data.frame( A = as.Date(as.character(x$A),'%Y%m%d'), B = x$B )
    • 在你的最后一句话中,你暗示你可以用你的方法覆盖前面的专栏。我尝试这样做(在没有cbind 步骤的情况下覆盖一行中的列),但仍然无法弄清楚。有了你的评论,我现在看到我可以重新定义 lapply 内的整个 data.frame(s),这很酷,所以这可能是我的单线解决方案。优雅地说,我的意思是在 data.frames 列表的一列上应用一个简单的函数(无需重新定义整个 data.frames)。
    • 相关(已删除)SO question ;-)
    • @StatSandwich,你也可以使用transforml2 &lt;- lapply(l, function(x) transform(x, A = as.Date(as.character(A),'%Y%m%d')))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多