听起来好像已经被问过多次了,但是我无法获得以前的任何解决方案。我有以下问题:
我有一个很大的数据框,其中包含骨骼测量和其他信息。一栏(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"))
这几乎是正确的事情,但是所有信息似乎都消失了,因为单元格中没有内容,而且我无法获得数据帧作为输出。
答案 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)