R - 将函数应用于类似data.frames列表中的特定列

时间:2013-11-19 01:39:46

标签: r vectorization lapply

我正在制作像这样的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()应用于date中每个data.frame的simulation_data列。我目前的解决方法是每次都在for循环中更新列,如下所示:  simulation_inv[['A']]['dt'] <- ymd(simulation_inv[['A']]['dt']), 但如果可能的话,我想把它矢量化。

我无法弄清楚如何使用lapply来做这件事,也许还有更好的解决方案。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这样的事,也许 -

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

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