0

我所拥有的是一个数据框,其中包含一个因子字段,其中包含用作因子的一系列值。据我了解,它本质上是数值的箱。

我想要做的是将这些转换为数值,以便我可以在下游分析中使用它们。这个想法很简单。(a) 获取一个采用因子水平的函数,将其拆分为破折号并提取数值并计算平均值,以及 (b) 应用列的函数

data$Range.mean <- sapply(data$Range, 
                             function(d) {
                               range <- as.matrix(strsplit(as.character(d), "-"))
                               (as.numeric(range[,1]) + as.numeric(range[,2]))/2
                             })

这给出了以下错误

Error in FUN(X[[1L]], ...) : 
  (list) object cannot be coerced to type 'double'

我试过lapply了,没有什么区别。在寻找答案时,我发现了这个问题的其他一些解决方案,它本质上是将下限和上限分别提取到单个数组中,然后计算成对平均值当然是微不足道的。

不过,我想了解我在做什么/想错了。为什么我的代码会出错,这个错误到底意味着什么?

4

1 回答 1

2

您是正确的,因为因子实际上是带有标签箱的整数。所以如果你有这样的因素

x <- factor(c("0-1", "0-1", "1-2", "1-2"))

它本质上是以下组件的组合

as.integer(x)
levels(x)

要将因子转换为其标签指定的实际值,您可以绕道as.character并将其解析为数字。

# Recreating a data frame with a factor like yours
data <- data.frame(Range = cut(runif(100), 0:10/10))
levels(data$Range) <- sub("\\((.*),(.*)]", "\\1-\\2", levels(data$Range))

# Calculating range means
sapply(strsplit(as.character(data$Range), "-"),
       function(x) mean(as.numeric(x)))
于 2013-11-12T12:56:44.133 回答