如何在过滤函数中使用 apply

How to use apply in a filter function

听起来好像已经被问过很多次了,但我无法使以前的任何解决方案起作用。我有以下问题:

我有一个包含骨骼测量和其他信息的大数据框。一列 (HREPP) 包含骨骼所在区域的名称。现在我想为每个区域创建一个新的数据框,以计算这个较小 table 内的均值、偏差等。 (我知道也可以从完整的 table 中计算出来,但这需要更多的编程技巧。)

我使用

为区域创建了一个唯一值的排序列表
unique_hrepp <- unique(ni[3]) 

因为该区域的列 "HREPP" 是 df "ni" 的第三列。然后我使用以下方式订购它:

unique_hrepp <- unique_hrepp[order(unique_hrepp$HREPP, decreasing = FALSE), ]

所有这些都运行良好,现在我想过滤大 table。最简单的事情是这样做:

hrepp_1 <- filter(fulltable, HREPP == unique_hrepp[1])
hrepp_2 <- filter(fulltable, HREPP == unique_hrepp[2])
hrepp_3 <- filter(fulltable, HREPP == unique_hrepp[3])

但我有大约 50 个区域,不想一遍又一遍地重复这个。另外我想知道它是如何正确完成的。

我来了

lapply(unique_hrepp, function(x) filter(fulltable, HREPP == "unique_hrepp"))

这几乎是正确的,但所有信息似乎都消失了,因为单元格中没有内容,而且我无法将数据帧作为输出。

正如索托斯所建议的那样:

您可以先使用 R 中的 split 函数拆分 data.frame 列表中的大 data.frame。只需确保 HREPP 列为 class factor。您不必订购它。

ldf = split(x = df, f = df$HREPP)

ldf 是 data.frames 的列表,其中每个 data.frame 将包含对 HREPP.

列中区域的唯一值的观察

现在您可以使用 lapply 分别计算列表中每个 data.frames 中每个区域的平均值:

ldf = lapply(x= ldf,FUN= function(t){t$mean_density = mean(t$density,na.rm=TRUE);t})
ldf = lapply(x= ldf,FUN= function(t){t$mean_weight = mean(t$weight,na.rm=TRUE);t})

然后您可以使用 data.table 包中的 rbindlist 将列表组合回 data.frame :

df = rbindlist(l = ldf,use.names=TRUE)
df = as.data.frame(df)