我有一个像下面这样的数据框(包含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?
中生成这些数据帧答案 0 :(得分:0)
以下是使用tidyr
和dplyr
的一种可能解决方案。首先,示例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))