如何拆分数据帧并能够在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))