如何使用申请过滤功能

时间:2019-12-02 13:59:07

标签: r apply filterfunction

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

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

我使用

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

因为该区域的“ HREPP”列是df“ ni”的第三列。然后我使用以下命令订购了它:

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

所有这些都运行良好,现在我想过滤大表。最简单的方法是:

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"))

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

1 个答案:

答案 0 :(得分:0)

如索托斯建议的那样:

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

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

ldf是data.frame的列表,其中每个data.frame将包含对HREPP列中region唯一值的观察。

现在,您可以使用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})

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

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