R:在条件下替换数据帧中的值

R:在条件下替换数据帧中的值,r,function,dataframe,mean,substitution,R,Function,Dataframe,Mean,Substitution,我得到了一个由三列组成的数据框架(参见代码中的示例)。第一列包含类别(a),第二列为观察数量(b),第三列为这些观察的平均值(c) 它工作得很好(但只是平均值而不是平均值)。输出为: [1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000纳 现在我的问题是,我有很多类别(n=32),我试图将这个函数应用于包含我的类别的向量。在这种情况下,一个简单的例子是: #test the function for a te

我得到了一个由三列组成的数据框架(参见代码中的示例)。第一列包含类别(a),第二列为观察数量(b),第三列为这些观察的平均值(c)

它工作得很好(但只是平均值而不是平均值)。输出为:

[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000纳

现在我的问题是,我有很多类别(n=32),我试图将这个函数应用于包含我的类别的向量。在这种情况下,一个简单的例子是:

    #test the function for a testvector
    test.vector<-c("aaa","ddd")
    function.abc(test.vector)
#测试测试向量的函数

test.vector我不太清楚你的意思,但是如果你想包括所有这样的行,你可以使用%in%

function.abc<-function(x){
  ifelse(
    (df.abc[,1] %in% x)&(df.abc[,2]==1),
    mean(df.abc$c[df.abc$a %in% x],na.rm=TRUE),
    df.abc[,3]
  )
}

> function.abc("aaa")
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000       NA

> test.vector<-c("aaa","ddd")
> function.abc(test.vector)
[1]  1  2  4  4  5  6  7 NA
function.abc function.abc(“aaa”)
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000纳
>test.vector函数.abc(test.vector)
[1] 1 2 4 5 6 7 NA

最后一个元素是NA,因为列“b”不是1。

我不太清楚你的意思,但是如果你想包括所有这样的行,你可以在%中使用%

function.abc<-function(x){
  ifelse(
    (df.abc[,1] %in% x)&(df.abc[,2]==1),
    mean(df.abc$c[df.abc$a %in% x],na.rm=TRUE),
    df.abc[,3]
  )
}

> function.abc("aaa")
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000       NA

> test.vector<-c("aaa","ddd")
> function.abc(test.vector)
[1]  1  2  4  4  5  6  7 NA
function.abc function.abc(“aaa”)
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000纳
>test.vector函数.abc(test.vector)
[1] 1 2 4 5 6 7 NA
最后一个元素是NA,因为列“b”不是1。

CatMeans CatMeans ifelse(is.NA(df.abc$c)、CatMeans[df.abc$a],df.abc$c)
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.000000
我相信你可以把它变成一个函数。如果您只想要
“aaa”
“ddd”
,那么您可以使用
ifelse(is.na(df.abc$c)&df.abc$a%c(“aaa”,“ddd”),…
CatMeans CatMeans ifelse(is.na(df.abc$c),CatMeans[df.abc$a],df.abc$c)
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.000000

我敢肯定,你可以把它变成一个函数。如果你只想要
“aaa”
“ddd”
,那么你可以使用
ifelse(is.na(df.abc$c)&df.abc$a%在%c中(“aaa”,“ddd”),…

为了在一个类别中同时处理多个列,您需要使用一些东西来拆分数据帧,然后处理组件。
lappy(split(df,fac),function(x){…})
范例非常适合于此。或者您可以使用
transform
plyr

> lapply( split( df.abc, df.abc$a), 
               function(dfrm) { dfrm[is.na(dfrm$c), "c"] <- 
                  weighted.mean(dfrm[!is.na(dfrm$c) , "c"], dfrm[!is.na(dfrm$c), "b"])
                         dfrm} )  
                # need to evaluate dfrm in order to return the full value.
$aaa
    a b   c
1 aaa 3 1.0
2 aaa 4 2.0
3 aaa 1 3.2
7 aaa 3 7.0

$ddd
    a b   c
4 ddd 3 4.0
6 ddd 7 6.0
8 ddd 2 5.4

$eee
    a b c
5 eee 5 5

为了在一个类别中同时处理多个列,您需要使用一些东西来拆分数据帧,然后处理组件。
lappy(split(df,fac),function(x){…})范式可以很好地解决这个问题。或者您可以使用
transform
plyr

> lapply( split( df.abc, df.abc$a), 
               function(dfrm) { dfrm[is.na(dfrm$c), "c"] <- 
                  weighted.mean(dfrm[!is.na(dfrm$c) , "c"], dfrm[!is.na(dfrm$c), "b"])
                         dfrm} )  
                # need to evaluate dfrm in order to return the full value.
$aaa
    a b   c
1 aaa 3 1.0
2 aaa 4 2.0
3 aaa 1 3.2
7 aaa 3 7.0

$ddd
    a b   c
4 ddd 3 4.0
6 ddd 7 6.0
8 ddd 2 5.4

$eee
    a b c
5 eee 5 5

对于最后一个案例,不清楚您希望返回什么。他希望
[1]1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.00000
我相信。鉴于问题的陈述,我认为提供的答案中的任何一个都不正确。如果三个项目属于“aaa”类别,且值
=c(1,2,7)
,计数
=c(3,4,3)
,那么加权平均数不是3.3333,而是3.2。如果我对问题陈述的理解是错误的,那么也许可以修改这个问题,以澄清为什么计算平均数时不使用计数?@SeñorO&Dwin这个问题不是100,所以我在上面编辑了它。Dwin是正确的,我只计算了100意思不是平均意思。他答对了问题,他的解决方案很好。不清楚最后一个案例你想要返回什么。他想要
[1]1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.00000
我相信。鉴于问题的陈述,我认为提供的答案中的任何一个都不正确。如果三个项目属于“aaa”类别,其值
=c(1,2,7)
,计数
=c(3,4,3)
,那么加权平均数不是3.3333,而是3.2。如果我对问题陈述的理解是错误的,那么也许可以修改这个问题,以澄清为什么计算平均数时不使用计数?@SeñorO&Dwin这个问题不是100,所以我在上面编辑了它。Dwin是正确的,我只计算了100他说的是正确的,他解决的问题很好。为我解决了问题。甚至没有考虑把它拆分,但这完全是有意义的。谢谢!为我做了。甚至没有考虑把它拆分,但这完全是有意义的。谢谢!
     aaa      ddd      eee 
3.333333 5.000000 5.000000 
> CatMeans <- tapply(df.abc$c, df.abc$a, function(x) mean(x, na.rm==T))
> ifelse(is.na(df.abc$c), CatMeans[df.abc$a], df.abc$c)
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.000000
> lapply( split( df.abc, df.abc$a), 
               function(dfrm) { dfrm[is.na(dfrm$c), "c"] <- 
                  weighted.mean(dfrm[!is.na(dfrm$c) , "c"], dfrm[!is.na(dfrm$c), "b"])
                         dfrm} )  
                # need to evaluate dfrm in order to return the full value.
$aaa
    a b   c
1 aaa 3 1.0
2 aaa 4 2.0
3 aaa 1 3.2
7 aaa 3 7.0

$ddd
    a b   c
4 ddd 3 4.0
6 ddd 7 6.0
8 ddd 2 5.4

$eee
    a b c
5 eee 5 5
 do.call( rbind, lapply( split( df.abc, df.abc$a), 
          function(dfrm) { dfrm[is.na(dfrm$c), "c"] <-
                 weighted.mean(dfrm[!is.na(dfrm$c) , "c"], dfrm[!is.na(dfrm$c), "b"])
                   dfrm} ) )
        a b   c
aaa.1 aaa 3 1.0
aaa.2 aaa 4 2.0
aaa.3 aaa 1 3.2
aaa.7 aaa 3 7.0
ddd.4 ddd 3 4.0
ddd.6 ddd 7 6.0
ddd.8 ddd 2 5.4
eee   eee 5 5.0