我需要计算数据帧中每一行的加权平均值,其中:有人知道如何使用R语言吗?问候
t1 <- c(1, 2, 4, 6, 7, 9)
t2 <- c(6, 6, 5, 3, 3, 7)
df <- data.frame(t1 = t1, t2=t2, stringsAsFactors = FALSE)
if value <= 5 , weight is 1
if value > 5 and <= 8 , weight is 2
if value > 8 , weight is 3
发布于 2019-03-03 16:24:55
使用tidyverse
计算每行的加权平均值的解决方案。
library(tidyverse)
df2 <- df %>%
# Add row numbers
rowid_to_column() %>%
# Convert to long format
gather(Group, Value, -rowid) %>%
# Assign weight
mutate(Weight = case_when(
Value <= 5 ~1,
Value > 5 & Value <= 8 ~2,
Value > 8 ~3,
TRUE ~NA_real_
)) %>%
# Calculated weighted average
group_by(rowid) %>%
summarize(Weighted_Mean = weighted.mean(Value, Weight)) %>%
ungroup()
df2
# rowid Weighted_Mean
# <int> <dbl>
# 1 1 4.33
# 2 2 4.67
# 3 3 4.5
# 4 4 5
# 5 5 5.67
# 6 6 8.2
发布于 2019-03-03 16:27:26
一个基本的R解决方案,函数findInterval
完成了主要部分。然后将结果与df
相乘,得到行平均值。
t1 <- c(1, 2, 4, 6, 7, 9)
t2 <- c(6, 6, 5, 3, 3, 7)
df <- data.frame(t1 = t1, t2=t2, stringsAsFactors = FALSE)
cp <- c(-Inf, 5, 8, Inf)
编辑。
如果权重被归一化为1
,那么正确的答案将是以下两个中的任何一个。
wt <- sapply(df, findInterval, cp)
rowSums(df*(wt/apply(wt, 1, sum)))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000
sapply(1:nrow(df), function(i)
weighted.mean(df[i,], sapply(df, findInterval, cp)[i,]))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000
这些结果现在与其他答案中的结果相等。
发布于 2019-03-03 16:36:32
如果你想乘以权重,然后除以它们的和(等于R中的weighted.mean
函数):
df %>%
mutate_at(vars(t1, t2),
list(weights = ~ case_when(. <= 5 ~ 1,
. > 5 & . <= 8 ~ 2,
TRUE ~ 3))) %>%
mutate(rowMeanWeighted = rowSums(.[, 1:2] * .[, 3:4]) / rowSums(.[, 3:4])) %>%
select(-contains("weights"))
输出:
t1 t2 rowMeanWeighted
1 1 6 4.333333
2 2 6 4.666667
3 4 5 4.500000
4 6 3 5.000000
5 7 3 5.666667
6 9 7 8.200000
https://stackoverflow.com/questions/54970901
复制相似问题