排除我的因子时的平均值

时间:2016-11-18 02:09:46

标签: r

我希望在排除我的因素时取平均值。这是我的数据:

dff= data.frame(v1 =c("a,b,d","b,a,g", "f,d") , v2 = c(1,2,3) )

例如,对于a,我希望将a的行的平均值排在第3行,平均值为3. f我希望取平均行数f是rrow 1和3,V2的平均值是(1 + 3)/ 2 = 1.5我的理想输出将是

factor   avg

  a       3
  b       3
  d       2
  f       1.5
  g       2

我尝试了两种方法:第一种方法:

dff2 <- cSplit(dff, "v1",   " , ", "long")

c <- setDT(dff2)[,  .(value = (sum(dff2$v2) - sum(v2))/(nrow(dff2)-.N)) , by =  v1]

和第二个:

library(tidyverse)

dff %>% separate_rows(v1,  convert = TRUE) %>%    
                     group_by(v1) %>%   
                     summarise(avg = mean(.$v2[!.$v1 %in% v1]))  

他们都没有给我理想的结果

1 个答案:

答案 0 :(得分:3)

首先,我们可以使用以下方法获取因子集合:

fac <- unique(unlist(strsplit(as.character(dff$v1),split=",")))
##[1] "a" "b" "d" "g" "f"

然后,我们可以使用以下方式计算您想要的内容:

avg <- sapply(fac, function(f) mean(ifelse(grepl(f,dff$v1), NA, dff$v2),na.rm=TRUE))
##  a   b   d   g   f 
##3.0 3.0 2.0 2.0 1.5 

在此,我们使用grepl来确定fac中是否找到了dff$v1。如果是,则ifelse返回该行的NA,如果不是,则返回该行的dff$v2值。然后,我们可以根据您的意愿计算mean,忽略NAfac中找到的dff$v1行。

或者,如果您愿意,我们可以将结果放入data.frame

data.frame(factor=fac,avg=avg)
##  factor avg
##a      a 3.0
##b      b 3.0
##d      d 2.0
##g      g 2.0
##f      f 1.5

为了使用%in%进行完全匹配,请考虑以下数据:

## Note use of stringsAsFactors=FALSE to avoid having to coerce to character
## for strsplit
dff <- data.frame(v1 =c("a,b,d","b,a,g", "a.b,f,d"), v2 = c(1,2,3), stringsAsFactors=FALSE)

fac <- unique(unlist(strsplit(dff$v1,split=",")))
##[1] "a"   "b"   "d"   "g"   "a.b" "f"  
avg <- sapply(fac, function(f) mean(ifelse(sapply(strsplit(dff$v1,split=","), function(d) f %in% d), NA, dff$v2),na.rm=TRUE))
##  a   b   d   g a.b   f 
##3.0 3.0 2.0 2.0 1.5 1.5