如何从R中的单个数据帧的每一行生成多个数据帧

时间:2014-12-09 01:13:45

标签: r

我有一个像下面这样的数据框(包含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?

中生成这些数据帧

3 个答案:

答案 0 :(得分:0)

以下是使用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
...

答案 1 :(得分:0)

tidyr解决方案将创建一个巨大的data.frame,其中列已转换为行。如果你真的需要为每一行提供单独的data.frames,那么我认为你真的想要一个循环。但是 - 你肯定你真的需要为每一行提供单独的data.frames吗?我的经验是,每当我想到这一点,就有一种更容易的方法。

答案 2 :(得分:0)

如果您只有base R

,则可以在100 rows中执行此操作
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))