我有一个带有数字数据和表的数据表(data.frame)。因子数据中有几个是字符变量(例如'species','Fam_name','gear'),我想计算每个's'的'weight'和'number'变量的小计(sum)。
我尝试过使用'aggregate'函数,但是我没有让它返回'gear'变量的字符值。
以下是我桌子的负责人
survey station ss species weight number bdep lon lat Sci_name Fam_name gear
1 2012901 1 2012901001 CARSC04 11.20 20 23 37.61650 19.14900 Scomberoides lysan CARANGIDAE TB
2 2012901 1 2012901001 SCMGR02 0.98 2 23 37.61650 19.14900 Grammatorcynus bilineatus SCOMBRIDAE TB
3 2012901 2 2012901002 NOCATCH 0.00 0 6 38.48333 18.71667 NO CATCH NO CATCH TB
4 2012901 3 2012901003 LUTLU06 5.65 1 6 38.48333 18.71667 Lutjanus bohar LUTJANIDAE TB
5 2012901 3 2012901003 SHACAB1 4.00 1 6 38.48333 18.71667 Triaenodon obesus CARCHARHINIDAE TB
6 2012901 4 2012901004 NOCATCH 0.00 0 9 38.48333 18.71667 NO CATCH NO CATCH TB
我尝试使用以下代码,目的是使用bind,
组合两者catch1<-aggregate(cbind(weight, number) ~ ss, data = catch, FUN = sum)
catch2<-aggregate(cbind(survey, station, bdep, lon, lat, gear) ~ ss, data = catch, FUN=median)
虽然第一行做了我想要的 - 每个's'的总和,另一个导致'齿轮'的数字中位数,而我希望它返回特定'ss'的'齿轮'代码。
“齿轮”因素的重建(感谢BrodieG):catch2$gear <- factor(levels(catch$gear)[catch2$gear], levels=levels(catch$gear))
问题解决了: - )
答案 0 :(得分:1)
您的问题是gear
是一个因素,因此median
返回因子数值的中位数。尝试:
catch2$gear <- factor(levels(catch$gear)[catch2$gear], levels=levels(catch$gear))
或类似的东西来重建catch2
的因子。
答案 1 :(得分:0)
我认为对于给定的gear
,可能有两种ss
。在这种情况下,问题归结为找到字符变量的中位数(或模式)。以下是查找字符变量模式的代码(此处为gear
)。
catch <- read.table(text = '
ss gear
1 AA
1 AA
1 BB
1 BB
2 CC
2 CC
2 CC
3 BB
4 AA
4 CC
', header = TRUE)
gear.mode <- tapply(catch$gear, catch$ss, function(x) { y = table(x) ; names(y)[y==max(y)] })
gear.mode <- as.data.frame(gear.mode)
gear.mode
gear.mode
1 AA, BB
2 CC
3 BB
4 AA, CC
您也可以使用aggregate
:
aggregate(gear ~ ss, data = catch, FUN = function (x) {
y = table(x) ; names(y)[y==max(y)]
})
ss gear
1 1 AA, BB
2 2 CC
3 3 BB
4 4 AA, CC