【问题标题】:How to Remove Null Values in a List如何删除列表中的空值
【发布时间】:2017-10-16 13:16:50
【问题描述】:

我创建了一个函数,它接收一个数据帧并返回该数据帧中数值变量的平均值和中位数。当我测试函数时,有 3 个空值。我将如何从中删除空值?

    df.numeric.summary <- function(data.frame1){

variable.list=list()
numcols <- sapply(data,is.numeric)
for(i in 1:ncol(data.frame1)){
  if (is.numeric(data.frame1[[i]]) == TRUE) {

    variable.list[[i]]=list(c("Mean"=mean(data.frame1[[i]], na.rm = TRUE),"Median"=median(data.frame1[[i]]), "IQR"=IQR(data.frame1[[i]])))
  }
}
return(variable.list)
}

我的输出如下所示:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[[4]][[1]]
    Mean   Median      IQR 
10.76687  3.56400  7.75100 


[[5]]
[[5]][[1]]
    Mean   Median      IQR 
10.43467  1.40000  4.50100 


[[6]]
[[6]][[1]]
    Mean   Median      IQR 
3.701434 0.839000 2.429500 

而输出应该是这样的

$Pb1
    Mean   Median      IQR 
10.76687  3.56400  7.75100 

$Pb2
    Mean   Median      IQR 
10.43467  1.40000  4.50100 

$Pb3
    Mean   Median      IQR 
3.701434 0.839000 2.429500 

【问题讨论】:

  • 你的意思是NULL还是NA?它们在 R 中是不同的。请提供带有示例输入数据的reproducible example
  • 我添加了我的代码。
  • 而想要的输出到底是什么。您正在分配给variable.list[[i]],但随后i=1 该列似乎不是数字。所以你第一次分配是当i=4留下那些NULL值。
  • 我添加了所需输出的图像。我为它之前没有出现而道歉。

标签: r function null


【解决方案1】:

如果您只使用Filter()Map(),这会容易得多

df.numeric.summary <- function(data.frame1){
    my_summary <- function(x) c(
      "Mean"=mean(x, na.rm = TRUE),
      "Median"=median(x, na.rm=TRUE),
      "IQR"=IQR(x, na.rm=TRUE))

    Map(my_summary, Filter(is.numeric, data.frame1))
}

你可以测试

df.numeric.summary(iris)

【讨论】:

    【解决方案2】:

    你必须使用na.rm=TRUE

    x <- c(1,2,5,7,NA,3)
    mean(x) # returns NA
    # [1] NA
    mean(x, na.rm=TRUE) # returns 3.6
    # [1] 3.6
    

    中位数计算类似。

    【讨论】:

      【解决方案3】:

      在计算meanmedian 时,将na.rm = T 作为选项传递给lapplysapply 应该会有所帮助

      > iris1 <- iris
      > 
      > #imputing NA
      > 
      > iris1[2,3] <- NA
      > 
      > iris1[3,2] <- NA
      > 
      > #without na.rm
      > 
      > lapply(iris1[1:4], mean)
      $Sepal.Length
      [1] 5.843333
      
      $Sepal.Width
      [1] NA
      
      $Petal.Length
      [1] NA
      
      $Petal.Width
      [1] 1.199333
      
      > 
      > 
      > lapply(iris1[1:4], mean, na.rm = T)
      $Sepal.Length
      [1] 5.843333
      
      $Sepal.Width
      [1] 3.056376
      
      $Petal.Length
      [1] 3.773826
      
      $Petal.Width
      [1] 1.199333
      
      > 
      > lapply(iris1[1:4], median, na.rm = T)
      $Sepal.Length
      [1] 5.8
      
      $Sepal.Width
      [1] 3
      
      $Petal.Length
      [1] 4.4
      
      $Petal.Width
      [1] 1.3
      

      【讨论】:

      • 我没有使用 lapply 或 sapply 函数
      • @Hannah 只有您分享您尝试过的代码,我们才能知道。
      • 能否请您更新data.frame1的示例输入数据
      • 这是一个非常大的数据框
      • 很难理解为什么 NULL 在没有导致它的样本数据的情况下发生
      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 2015-09-20
      • 2019-12-22
      • 2021-07-11
      • 1970-01-01
      • 2020-05-29
      相关资源
      最近更新 更多