【问题标题】:Mean of Cell in RR中的单元格平均值
【发布时间】:2014-10-04 14:32:45
【问题描述】:

我的初始数据如下所示:

ID<-c(1,2,3,4)
Value<-c("1,2","0,-1",1,"","")
Data<-data.frame(ID, Value)

我想为每一行从 Value 创建一个 MeanValue。如果价值没有价值,我想取平均值。

我计算第一步均值的想法是:

library(stringr)
AverageMean<-mean(as.numeric(str_split(Data$Value, ",")))

但它正在创建一个错误

最终数据应该看起来像:

ID<-c(1,2,3,4)
Value<-c("1,2","0,-1",1,"","")
AverageMean<-c(1.5,-0.5,1,0.666,0.666)
FinalData<-data.frame(ID, Value, AverageMean)

【问题讨论】:

  • @akrun 对于第二步,它应该成为其他帖子的平均值。所以它从 NA 变为 0.666
  • 我建议放弃 str_split 并改用基础 R 中的 strsplit。如果您处理的是中等大小的数据集,也会有很大的不同。
  • @Carlo 我更新了帖子。

标签: r list split


【解决方案1】:

根据信息并处理您的代码,首先您在相关列上执行str_split,输出为list。要获取单个列表元素的mean,您可以使用lapplymean。然后unlist它,并将最后一个值Val[length(Val)]替换为所有其他值的mean,并基于上述创建一个新列AverageMean

 Val <- unlist(lapply(str_split(Data$Value, ","),
                  function(x) mean(as.numeric(x), na.rm=TRUE)))
 Val[length(Val)] <- mean(Val[-length(Val)], na.rm=TRUE)
 Data$AverageMean <- Val
  Data
  #  ID Value AverageMean
  #1  1   1,2   1.5000000
  #2  2  0,-1  -0.5000000
  #3  3     1   1.0000000
  #4  4         0.6666667

更新

如果您有多个missing values 并希望将其替换为列的mean

   Data <- data.frame(ID=1:5, Value=c("1,2", "0,-1", 1, "", ""))
   Val <- unlist(lapply(str_split(Data$Value, ","),
               function(x) mean(as.numeric(x), na.rm=TRUE)))

上述步骤相同。使用is.na 创建一个逻辑索引,并通过否定逻辑索引!is.na 将所有这些缺失值替换为未缺失值的平均值。

   Val[is.na(Val)] <- mean(Val[!is.na(Val)])
   Data$AverageMean <- Val
   Data
   # ID Value AverageMean
   #1  1   1,2   1.5000000
   #2  2  0,-1  -0.5000000
   #3  3     1   1.0000000
   #4  4         0.6666667
   #5  5         0.6666667

【讨论】:

  • 正确,但是你需要用最后一个值的平均值替换 NaN(如果我理解正确的话)
  • @akrun 我刚刚发现了一个问题。它不能很好地处理它具有多个空值的情况。(我只是编辑了问题以更好地显示问题)
猜你喜欢
  • 2019-06-10
  • 2013-05-10
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多