您可以尝试以下操作:
eumR <- eumR[complete.cases(eumR),]
eumR$mean <- apply(eumR,1,function(x) {
x <- as.numeric(x[3:7])
mean(x[!(x %in% c(min(x),max(x)))])})
如果没有可复制的示例,我将无法调试,请提供一个示例。
,
这也是tidyverse
解决方案。将使用pivot_longer
从宽格式转换为长格式,这对于管理此类数据将是更好的选择。 drop_na
将删除缺少值的数据行。
对于每个town
和id
,将filter
确保您有5行数据。然后,将对值进行排名(关系是随机确定的)。这样可以确保您在出现最小或最大平局的情况下可以基于5个值中的3个来计算平均值。
library(tidyverse)
df %>%
pivot_longer(cols = starts_with("eumr"),names_to = "eumr",values_to = "value") %>%
drop_na(value) %>%
group_by(town,id) %>%
filter(n() == 5) %>%
mutate(the_rank = rank(-value,ties.method = "random")) %>%
filter(the_rank > 1 & the_rank < 5) %>%
summarise(mean_value = mean(value))
,
好的,在大家的帮助下,我找到了这个解决方案:
install.packages("NCmisc")
图书馆(NCmisc)
删除数字列表的最小值和最大值的函数,并返回平均值
drop_avg = function(v){
new = v[v != max(v) & v!= min(v)] # remove min & max
avg = mean(new)
return(avg)
}
为平均值创建新列
data$avg_E_Inner_R = NA
data$avg_E_Inner_L = NA
data$avg_M_Inner_R = NA
data$avg_M_Inner_L = NA
遍历数据框“data”的行
删除最小值和最大值,取平均值,将平均值放入数据框中的另一列
for (row in 1:nrow(data)){
E_Inner_R = data[row,c("E_Inner_R_Arm_1","E_Inner_R_Arm_2","E_Inner_R_Arm_3","E_Inner_R_Arm_4","E_Inner_R_Arm_5")]
data[row,]$avg_E_Inner_R = drop_avg(E_Inner_R)
E_Inner_L = data[row,c("E_Inner_L_Arm_1","E_Inner_L_Arm_2","E_Inner_L_Arm_3","E_Inner_L_Arm_4","E_Inner_L_Arm_5")]
data[row,]$avg_E_Inner_L = drop_avg(E_Inner_L)
M_Inner_R = data[row,c("M_Inner_R_Arm_1","M_Inner_R_Arm_2","M_Inner_R_Arm_3","M_Inner_R_Arm_4","M_Inner_R_Arm_5")]
data[row,]$avg_M_Inner_R = drop_avg(M_Inner_R)
M_Inner_L = data[row,c("M_Inner_L_Arm_1","M_Inner_L_Arm_2","M_Inner_L_Arm_3","M_Inner_L_Arm_4","M_Inner_L_Arm_5")]
data[row,]$avg_M_Inner_L = drop_avg(M_Inner_L)
}
本文链接:https://www.f2er.com/3158038.html