I have a 32x43 data.frame called "allg2", and I recreated a small portion of it here as 5x5 for simplicity:
gneiss mylonite syenite sedimentary Catg
0 3 4 0 -105.7
2 90 1 0 -99.7
15 51 0 0 -95.25
6 0 0 0 -90.5
0 3 9 0 -85.45
As requested, a sample calculation: The 'gneiss' column would be wm=(0/21*-105.7)+(2/21*-99.7)+(15/21*-95.25)+(6/21*-90.5)+(0/21*-85.45)
I would like a weighted mean for each column (with the values of interest in Catg, and each column as the weights for that column), but each solution to this that I can find relies on coding in all of the column names. Is it possible to do this without such a list? Note: I just realized that I have been flipping the weights and values to weigh the entire time. My attempts:
wm=allg2[,lapply(.SD,weighted.mean,w=Catg),by=list(allg2[1,])]
Error: unused argument (by = list(allg2[1, ]))
I found this idea from this thread , and tried to adapt it to my situation. Is it not selecting the column names because they're not a true row? I don't really know what this is doing, and I tried temoving the by= part, which gives the error
Error in lapply(.SD, weighted.mean, w = Catg) : object '.SD' not found
Another attempt was based on this thread . "Catg" is in the 43rd column, so I tried organizing the line as such:
wm=apply(allg2, 2, function(x) weighted.mean(x[,43], x[,1:42]))
Error in x[, 43] : incorrect number of dimensions
I really don't understand this error, because my column of weights should be in [,43].
I have also tried:
mallg=data.matrix(allg2)
wm=colWeightedMeans(mallg,allg2$Catg)
Error in colWeightedMeans.matrix(mallg, allg2$Catg) : Argument 'w' has negative weights.
I'm really at a loss here. Am I making some small error or am I going about this the completely wrong way?
Assuming that your weights are in the last column:
ll <- lapply(df[ , -ncol(df)], weighted.mean, w = df$Catg)
ll
# $gneiss
# [1] 4.555497
#
# $mylonite
# [1] 30.22283
#
# $syenite
# [1] 2.709924
#
# $sedimentary
# [1] 0
Edit : following your comment, you now need to do:
lapply(df[ , -ncol(df)], weighted.mean, x = df$Catg)
dt[,lapply(.SD,weighted.mean,w=Catg)]
apply(dt, 2, function(col) weighted.mean(x = col, w = dt[,Catg]))
I think you need to understand the arguments to each function better.
Update after OP changed question to weights being across columns and value being in Catg
- dt[,lapply(.SD,weighted.mean,x=Catg)]; apply(dt, 2, function(col) weighted.mean(w = col, x = dt[,Catg]))
dt[,lapply(.SD,weighted.mean,x=Catg)]; apply(dt, 2, function(col) weighted.mean(w = col, x = dt[,Catg]))
我是R的新手,但为什么不呢?
sapply(allg2[,-ncol(allg2)], weighted.mean, allg2$Catg)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.