【问题标题】:How to generate several data frames from each row of a single data frame in R如何从R中单个数据帧的每一行生成多个数据帧
【发布时间】:2014-12-09 01:13:45
【问题描述】:

我有一个如下所示的数据框(其中包含 100 行,这里我只给出了 6 行)。

CTFIP   Hispanic    Non Hispanic
6001    323307  1154673
6003    63      1113
6005    4566    33761
6007    29512   189123
6009    4595    41399
6011    11136   10029

我想为每一行生成不同的数据框,应该是这样的

HISPn   Freq
1      323307
2     11154673

其中 1= 西班牙裔,2= 非西班牙裔

如何在 R 中生成这些数据帧?

【问题讨论】:

    标签: r


    【解决方案1】:

    tidyr 解决方案将创建一个巨大的 data.frame,其中列已转换为行。如果你真的需要为每一行单独的 data.frames,那么我认为你真的想要一个循环。但是 -- 你确定你真的需要为每一行单独的 data.frames 吗?我的经验是,每次我想到这一点时,都会有一种更简单的方法来做到这一点。

    【讨论】:

      【解决方案2】:

      这是使用tidyrdplyr 的一种可能解决方案。一、示例data.frame

      dd<-read.table(text="CTFIP   Hispanic    NonHispanic
      6001    323307  1154673
      6003    63  1113
      6005    4566    33761
      6007    29512   189123
      6009    4595    41399
      6011    11136   10029", header=T)
      

      然后

      library(tidyr)
      library(dplyr)
      
      dd %>% gather(ethnicity, freq, -CTFIP) %>% 
          mutate(HISPn=ifelse(ethnicity=="Hispanic", 1,2)) %>%
          select(HISPn, freq)
      

      返回

         HISPn    freq
      1      1  323307
      2      1      63
      3      1    4566
      4      1   29512
      5      1    4595
      6      1   11136
      7      2 1154673
      8      2    1113
      9      2   33761
      10     2  189123
      11     2   41399
      12     2   10029
      

      如果你想要一堆不同数据帧的列表(这听起来是个坏主意),你可以这样做

      dd %>% gather(ethnicity, freq, -CTFIP) %>% 
          mutate(HISPn=ifelse(ethnicity=="Hispanic", 1,2)) %>%
          select(CTFIP , freq, HISPn) %>%
          {split(., .$CTFIP)}
      

      返回

      $`6001`
        CTFIP    freq HISPn
      1  6001  323307     1
      7  6001 1154673     2
      $`6003`
        CTFIP freq HISPn
      2  6003   63     1
      8  6003 1113     2
      ...
      

      【讨论】:

      • 我需要每一行的数据框,而不是所有行的总和。谢谢
      • 确保您已安装tidyr
      • 由于某些原因,我无法安装 tidyr。顺便说一句,这里给出的结果是基于每列的总和。但我需要为每一行使用不同的数据框。
      • 我已经更新了我的回复,它创建了一堆 data.frames 的列表。然而,这似乎是一种非常不友好的数据格式。
      【解决方案3】:

      如果您只有100 rows,您可以在base R 中执行此操作

      lst <- setNames(lapply(seq_len(nrow(df)), function(i) 
             data.frame(HISPn=1:2, Freq=unlist(df[i,-1], use.names=FALSE))), 
                                                        paste0('df', df$CTFIP))
      

      最好将其作为 data.frames 的列表。但是,如果您在全局环境中需要单独的 data.frame 对象。

      list2env(lst, envir=.GlobalEnv)
      #<environment: R_GlobalEnv>
      
      df6001
      # HISPn    Freq
      #1     1  323307
      #2     2 1154673
      

      或者你可以使用reshape 来自base R

      colnames(df)[-1] <- paste('Freq', 1:2, sep='.')
      dfL <- reshape(df, direction='long', idvar='CTFIP', 
                                   varying=2:3, timevar='HISPn')
      row.names(dfL) <- NULL
      lst1 <- split(dfL[,-1], df$CTFIP)
      names(lst1) <- paste0('df', names(lst1))
      list2env(lst1, envir=.GlobalEnv)
      df6001
      #  HISPn    Freq
      #1     1  323307
      #7     2 1154673
      

      数据

      df <- structure(list(CTFIP = c(6001L, 6003L, 6005L, 6007L, 6009L, 6011L
      ), Hispanic = c(323307L, 63L, 4566L, 29512L, 4595L, 11136L), 
      Non.Hispanic = c(1154673L, 1113L, 33761L, 189123L, 41399L, 
      10029L)), .Names = c("CTFIP", "Hispanic", "Non.Hispanic"), class = "data.frame",
      row.names = c(NA, -6L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 2020-12-18
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多