我希望在排除我的因素时取平均值。这是我的数据:
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]))
他们都没有给我理想的结果
答案 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
,忽略NA
在fac
中找到的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