如何拆分数据帧并能够在R中使用子数据帧
问题就在这里。我有一个数据帧,假设如下:如何拆分数据帧并能够在R中使用子数据帧,r,split,R,Split,问题就在这里。我有一个数据帧,假设如下: sp rd pH abund area point dog uniq 4.5 5 1 a dog uniq 4.2 5 1 a dog for 6.1 3 1 a cat uniq 7.0 8 1 a cat uniq 4.9 5 1 a cat mains 3.1 9 1 b cat mains 6.5
sp rd pH abund area point
dog uniq 4.5 5 1 a
dog uniq 4.2 5 1 a
dog for 6.1 3 1 a
cat uniq 7.0 8 1 a
cat uniq 4.9 5 1 a
cat mains 3.1 9 1 b
cat mains 6.5 1 1 b
cat mains 6.5 3 1 b
dog for NA 2 2 a
bird mac 5.0 3 2 a
bird mac 4.1 5 2 a
bird mac 5.1 NA 2 a
rabb lol 5.0 8 2 b
rabb lol 4.2 5 2 b
rabb lol 6.0 2 2 b
rabb lol 2.8 3 2 b
我想通过区域
和点
(1a、1b、2a、2b)的独特组合将此数据帧拆分为多个数据帧,并希望仍然能够单独使用它们。例如,我想找出每组的平均数。我尝试使用split
函数,但问题是,每个组只有名称,例如1.a,我不能命令R在这个数据帧内执行任何操作
谢谢回答。如果我正确理解了您的问题,下面是我的尝试:
sp <-
c("dog","dog","dog","cat","cat","cat","cat","cat","dog","bird","bird",
"bird","rabb","rabb","rabb","rabb")
rd <-
c("uniq","uniq","for","uniq","uniq","mains","mains","mains",
"for","mac","mac","mac","lol","lol","lol","lol")
pH <-
c(4.5,4.2,6.1,7.0,4.9,3.1,6.5,6.5,NA,5.0,4.1,5.1,5.0,4.2,6.0,2.8)
abund <-
c(5,5,3,8,5,9,1,3,2,3,5,NA,8,5,2,3)
area <-
c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)
point <-
c("a","a","a","a","a","b","b","b","a","a","a","a","b","b","b","b")
df <- data.frame(sp,rd,pH,abund,area,point)
cols <-c("area","point")
df$group <- apply(df[,cols],1,paste,collapse="")
df$group <- as.factor(df$group)
str(df$group)
sapply(split(df$abund,df$group),mean,na.rm=TRUE)
如果有人想要分割数据帧,这里有一个替代方案。以下是基于此步骤的数据帧的外观
df$group <- apply(df[,cols],1,paste,collapse="")
df
sp rd pH abund area point group
1 dog uniq 4.5 5 1 a 1a
2 dog uniq 4.2 5 1 a 1a
3 dog for 6.1 3 1 a 1a
4 cat uniq 7.0 8 1 a 1a
5 cat uniq 4.9 5 1 a 1a
6 cat mains 3.1 9 1 b 1b
7 cat mains 6.5 1 1 b 1b
8 cat mains 6.5 3 1 b 1b
9 dog for NA 2 2 a 2a
10 bird mac 5.0 3 2 a 2a
11 bird mac 4.1 5 2 a 2a
12 bird mac 5.1 NA 2 a 2a
13 rabb lol 5.0 8 2 b 2b
14 rabb lol 4.2 5 2 b 2b
15 rabb lol 6.0 2 2 b 2b
16 rabb lol 2.8 3 2 b 2b
df$group尝试使用“groupby”。我不确定您想要的确切数据,但如果您想要面积和点的每个组合的平均pH值,您可以:
显然,你必须处理你的NA值,但这将通过独特的组组合进行分类
df.grp <- group_by(df, area, point) %>%
summarize(meanpH = mean(pH))
df.grp%
汇总(平均pH=平均(pH))
库(data.table);setDT(DF)[,{DO STUFF HERE},by=(area,point)]
这个库的介绍性资料可以在这里找到:transform(DF,mean_abund=ave(abund,area,point))
。或者,聚合(abund~area+point,DF,mean)
取决于你想要什么。为什么不sprintf(“%i%s”,DF$area,DF$point)
到一个新的列中,然后大量地分组呢?Thx很多,但这并不能解决我的问题。我需要将数据帧拆分为数据帧,这是可以使用的。解决卑鄙的问题教会我去解决这个问题,而且只解决这个小问题。但是再次非常感谢你。嗯,好的,我可以修改它,我以为你指的是更多的分离-应用-组合范例。让我澄清一下,您想基于列组合创建几个数据帧,然后计算它们的平均值吗?如果提供的答案解决了您的问题而不需要创建额外的对象,那么细分的目的是什么?我编辑了代码,但是,我个人认为没有必要将df拆分为新df并计算平均值,因为您可以使用sapply()
df1a <- df[grepl("1a",df$group),]
df1a
sp rd pH abund area point group
1 dog uniq 4.5 5 1 a 1a
2 dog uniq 4.2 5 1 a 1a
3 dog for 6.1 3 1 a 1a
4 cat uniq 7.0 8 1 a 1a
5 cat uniq 4.9 5 1 a 1a
df.grp <- group_by(df, area, point) %>%
summarize(meanpH = mean(pH))