如何在跳过不完整的行的同时在多列中删除行中的最小值和最大值

我在夏天收集了一些数据,试图以一种简单的方式进行分析。我有几列,但数据本身跨越5列和100多个行。

每行是具有参与者ID的单个参与者。我正在尝试通过所有5列在其行中删除它们的最小和最大测量值,因此只剩下3列。我还需要删除没有全部5个测量值的所有个人。然后,使用这三列,我需要求平均值并创建一个包含平均值的新的第四列。

不同的方式让我有点不知所措。它需要能够遍历所有行。如果您有任何建议,请告诉我。

这就是数据框(eumR)的样子...

> eumR town id eumr1 eumr2 eumr3 eumr4 eumr5 1 WLS SA4001 NA NA NA NA NA 2 WLS SA4002 NA NA NA NA NA 3 WLS SA4003 NA NA NA NA NA 4 WLS SA4004 NA NA NA NA NA 5 WLS SA4005 NA NA NA NA NA .... 80 BVL SA4080 12.6 15.2 13.6 14.9 14.2 81 BVL SA4081 15.2 16.5 16.5 17.3 20.5 82 BVL SA4082 15.1 14.8 14.5 14.6 16.7 83 BVL SA4083 15.6 15.8 15.8 15.5 13.2 84 BVL SA4084 15.7 15.8 17.3 17.9 20.8

hmf525 回答:如何在跳过不完整的行的同时在多列中删除行中的最小值和最大值

您可以尝试以下操作:

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将删除缺少值的数据行。

对于每个townid,将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

大家都在问