gpt4 book ai didi

r - 排除我的因素后的平均值

转载 作者:行者123 更新时间:2023-12-02 09:02:48 25 4
gpt4 key购买 nike

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

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]))

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

最佳答案

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

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 来确定是否在 dff$v1 中找到每个 fac。如果是,则 ifelse 返回该行的 NA,如果不是,则返回该行的 dff$v2 值。然后,我们可以计算平均值,忽略facdff$v1中找到的那些行的NA ,如你所愿。

或者,如果您愿意,我们可以将结果放入 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

关于r - 排除我的因素后的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com