使用lapply进行简单功能时的替换错误

时间:2017-10-25 22:15:38

标签: r

我试图在列表列表中使用lapply进行简单的描述性统计。这是我的列表代码示例:

varlist <- list(
  datafile$Ho, 
  datafile$Hd, 
  datafile$Vo, 
  datafile$Vd, 
  datafile$TDC, 
  datafile$W, 
  datafile$Ao, 
  datafile$Ad, 
  datafile$Freq)

我创建了一个数据帧来存储名为descript:

的新值
descript <- data.frame(
  mean = as.numeric(), 
  sd = as.numeric(), 
  range = as.numeric(),
  median = as.numeric())

所有这一切都运行正常,但是只要我把它扔进lapply我得到一个问题,说明替换有2行,数据有1

lapply(varlist,function(x){
  descript$mean <- mean(x,na.rm = TRUE)
  descript$sd <- sd(x,na.rm = TRUE)
  descript$range <- range(x,na.rm = TRUE)
  descript$median <- median(x,na.rm = TRUE)
})

我已经查看了同类的其他编码问题,但每个答案似乎都是特定于应用程序的。我不是最好的编码,但如果有人能够解释问题是什么或者如何生成问题并给我解决我的问题,我将非常感激,谢谢

2 个答案:

答案 0 :(得分:0)

我相信你的问题来自range(),它输出2个数而不是1个。解决这个问题的一种方法是执行以下操作:

descript$range_a <- range(x,na.rm = TRUE)[1]
descript$range_b <- range(x,na.rm = TRUE)[2]

(我很确定这是你的问题,但有一点很重要的事情就是创建一个可重现的示例,这样我就可以运行你的代码来仔细检查,例如我不确定是什么{{ 1}}看起来,我无法按原样运行您的代码,这是reprex包的一个很好的资源。

答案 1 :(得分:0)

我认为问题在于您初始化了一个空数据框,然后尝试按列添加到它。 R不喜欢那样。

此外,正如Lucy指出的那样,range()会输出2个数字,因此理想情况下,您需要在单独的列中捕获它们。

不知道它有多高效,但尝试这样的事情(改编自露西的回答和另一个问题的this answer):

# Using some sample data
varlist <- list(c(1, 2, 2, 3), c(4, 4, 5, 6), c(7, 8, 9, 10))

tmp <- lapply(varlist, function(x) {
  mean <- mean(x, na.rm = TRUE)
  sd <- sd(x, na.rm = TRUE)
  range_low <- range(x, na.rm = TRUE)[1]
  range_high <- range(x, na.rm = TRUE)[2]
  median <- median(x, na.rm = TRUE)

  data.frame(mean, sd, range_low, range_high, median)
})

descript <- do.call(rbind, tmp)

> descript
  mean        sd range_low range_high median
1 2.00 0.8164966         1          3    2.0
2 4.75 0.9574271         4          6    4.5
3 8.50 1.2909944         7         10    8.5