【问题标题】:find the average of columns for each row by ignoring strings in middle通过忽略中间的字符串来查找每行的列的平均值
【发布时间】:2018-07-07 05:34:01
【问题描述】:

这是我的数据

para1  para2  c1   c2   c3   c4  c5   c6   
ast    abc    3    4    NR   6    8    6    
ast    pqr    4    8    2    5     3   2    
bc      sd  -0.3   2    0.4  NR    NR   3   

我需要输出为

para1 para2  c1   c2   c3   c4  c5   c6   mean
    ast    abc   3   4    NR   6    8    6     20.8
    ast    pqr   4   8    2    5     3   2     4
    bc      sd -0.3  2    0.4  NR    NR   3    3

我想通过忽略字符串 NR 来查找每行从 c2 列到 c6 列的平均值,但它应该考虑列数,尽管 NR 被忽略了。

【问题讨论】:

    标签: r dataframe mean


    【解决方案1】:

    数据:

    df = read.table(text='para1  para2  c1   c2   c3   c4  c5   c6   
    ast    abc    3    4    NR   6    8    6    
                    ast    pqr    4    8    2    5     3   2    
                    bc      sd  -0.3   2    0.4  NR    NR   3  ',header=T)
    

    请注意,其中包含NR 值的列被归类为factor,而不是numeric


    您可以使用apply 作为行的意思:

    apply(df[,c('c2','c3','c4','c5','c6')],1, function(x) 
                          {mean(as.numeric(as.character(x)),na.rm=T)})
    

    或者转换为矩阵并使用rowMeans

    x<-as.matrix(df[,c('c2','c3','c4','c5','c6')])
    class(x)<-'numeric'
    rowMeans(x,na.rm = T)
    

    输出:

    6.0 4.0 1.8
    

    如果您想“考虑计数”,如果我理解正确,您应该这样做:

    apply(df[,c('c2','c3','c4','c5','c6')],1, function(x) 
                        {sum(as.numeric(as.character(x)),na.rm=T)/length(x)})
    

    x<-as.matrix(df[,c('c2','c3','c4','c5','c6')])
    class(x)<-'numeric'
    x[is.na(x)]=0
    rowMeans(x,na.rm = T)
    

    返回:

    4.80 4.00 1.08
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2022-11-13
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多