【问题标题】:How to run a loop over names() of a data frame to create new data frames in R?如何在数据框的名称()上运行循环以在 R 中创建新的数据框?
【发布时间】:2020-05-16 15:15:30
【问题描述】:

我有一个名为 'active' 的数据集,其中包含 'mh'、'dl'、'rj' 和 'date' 列。我想在它上面运行以下操作,但最好是在一个循环中。我该怎么做?

mh1 <- cbind.data.frame(active$mh, active$date) 
names(mh1) <- c('cases', 'date')
mh1$date <- dmy(mh1$date)

dl1 <- cbind.data.frame(active$dl, active$date) 
names(dl1) <- c('cases', 'date')
dl1$date <- dmy(dl1$date)

rj1 <- cbind.data.frame(active$rj, active$date) 
names(rj1) <- c('cases', 'date')
rj1$date <- dmy(rj1$date)

【问题讨论】:

    标签: for-loop sapply


    【解决方案1】:

    这里实际上有一个巧妙的解决方案,并在下面给出。不过,首先,您应该通过active$date &lt;- dmy(active$date) 避免冗余代码。它保留所有进一步子集的格式。

    原问题的代码如下。请注意,代码非常通用,以至于您可以拥有超过三列 mhrjdl,例如100 列,只要 data.frame 在最后一列中有您要绑定其他列的数据。

    数据

    > active <- data.frame(mh = c(1, 2), dl = c(3, 4), 
                           rj = c(4, 5), date = c("31/12/2020", "30/12/2020"))
    > active
      mh dl rj       date
    1  1  3  4 31/12/2020
    2  2  4  5 30/12/2020
    

    代码

    df_list <- lapply(1:(nrow(expand.grid(1:(ncol(active) - 1), ncol(active)))), 
                      function(x) active[, unlist(expand.grid(1:(ncol(active) - 1),   
                                  ncol(active))[x,])]) %>% 
               lapply(., function(x){names(x) <- c("Cases", "Date"); x}) 
    

    输出

    [[1]]
      Cases       Date
    1     1 31/12/2020
    2     2 30/12/2020
    
    [[2]]
      Cases       Date
    1     3 31/12/2020
    2     4 30/12/2020
    
    [[3]]
      Cases       Date
    1     4 31/12/2020
    2     5 30/12/2020
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多