【问题标题】:R Loop code over several lists of dataframesR在几个数据帧列表上循环代码
【发布时间】:2019-10-17 03:23:00
【问题描述】:

我有几个数据框列表,我想格式化所有数据框列表中每个单个数据框的日期。这是一个示例代码:

v1 = c("2000-05-01", "2000-05-02", "2000-05-03", "2000-05-04", "2000-05-05")
v2 = seq(2,20, length = 5)
v3 = seq(-2,7, length = 5)
v4 = seq(-6,3, length = 5)

df1 = data.frame(Date = v1, df1_Tmax = v2, df1_Tmean = v3, df1_Tmin = v4)
dfl1 <- list(df1, df1, df1, df1)
names(dfl1) = c("ABC_1", "DEF_1", "GHI_1", "JKL_1")

v1 = c("2000-05-01", "2000-05-02", "2000-05-03", "2000-05-04", "2000-05-05")
v2 = seq(3,21, length = 5)
v3 = seq(-3,8, length = 5)
v4 = seq(-7,4, length = 5)

df2 = data.frame(Date = v1, df2_Tmax = v2, df2_Tmean = v3, df2_Tmin = v4)
dfl2 <- list(df2, df2, df2, df2)
names(dfl2) = c("ABC_2", "DEF_2", "GHI_2", "JKL_2")

v1 = c("2000-05-01", "2000-05-02", "2000-05-03", "2000-05-04", "2000-05-05")
v2 = seq(4,22, length = 5)
v3 = seq(-4,9, length = 5)
v4 = seq(-8,5, length = 5)

df3 = data.frame(Date = v1, df3_Tmax = v2, df3_Tmean = v3, df3_Tmin = v4)
dfl3 <- list(df3, df3, df3, df3)
names(dfl3) = c("ABC_3", "DEF_3", "GHI_3", "JKL_3")

v1 = c("2000-05-01", "2000-05-02", "2000-05-03", "2000-05-04", "2000-05-05")
v2 = seq(2,20, length = 5)
v3 = seq(-2,8, length = 5)
v4 = seq(-6,3, length = 5)

abc = data.frame(Date = v1, ABC_Tmax = v2, ABC_Tmean = v3, ABC_Tmin = v4)

abclist <-list(abc, abc, abc, abc)

names(abclist) = c("ABC_abc", "DEF_abc", "GHI_abc", "JKL_abc")

我知道如何手动更改日期列:

dfl1$ABC_1$Date = as.Date(dfl1$ABC_1$Date,format="%Y-%m-%d")
class(dfl1$ABC_1$Date)

但是我怎样才能为我的所有数据框列表中的每个日期列做到这一点?

【问题讨论】:

    标签: r list loops dataframe lapply


    【解决方案1】:

    这是使用getassign 的一个选项

    nms <- c('dfl1', 'dfl2', 'dfl3', 'abclist')
    lapply(nms, function(x) assign(x,lapply(get(x), 
                                     function(y) {y$Date1 <- as.Date(y$Date, format="%Y-%m-%d") 
                                     return(y)}), 
                            envir = .GlobalEnv))
    

    PS:小心assign,因为它会改变你的全球环境.GlobalEnv。许多 R 用户会建议使用列表解决方案而不是 assign

    【讨论】:

    • 为什么会有这么大的问题?有什么风险?
    • 哦,我现在看到了问题所在。它添加了具有更新日期的另一列。这实际上并不是那么好。
    • @Essi 我只是添加了Date1 看看你可以做什么y$Date &lt;- as.Date(y$Date, format="%Y-%m-%d")
    【解决方案2】:

    这可以通过lapply来完成:

    lapply(dfl1, function(x) {
      x$Date <- as.Date(x$Date, format="%Y-%m-%d") 
      return(x)})
    

    如果您想为所有 df-lists 执行此操作,您需要将它们存储在一个列表中,然后您可以使用上述调用的略微修改版本:

    df_list <- list(dfl1, dfl2, dfl3, abclist)
    
    lapply(df_list, function(x) {
      x[[1]]$Date <- as.Date(x[[1]]$Date, format="%Y-%m-%d") 
      return(x)})
    

    这假定Date-列始终具有相同的名称“日期”。

    【讨论】:

    • 您能告诉我如何为我的所有数据框列表执行此操作吗?这实际上是我的问题。
    • 是的,很抱歉,当我第一次写答案时,最后一部分丢失了。
    • 谢谢!我看到这个命令将所有列表存储在一个大列表中。我该怎么做才能再次获得我的原始文件?我的意思是所有列表都使用与以前相同的名称分隔,但更新的日期列?
    • 您可以将第一个版本分别应用于每个 df 列表,即在第一次调用中使用 dfl2 而不是 dfl1。具有相同的列名应该不是问题,因为 dfs 存储在不同的列表条目中......
    • 您可以重新分配它们:dfl1 &lt;- df_list$dfl1 等等,但我猜您更多的是寻找 A. Suliman 的解决方案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多