【问题标题】:Unsplit reduced data table based on two factors in R基于R中的两个因素未拆分的缩减数据表
【发布时间】:2014-06-19 03:28:34
【问题描述】:

假设我在 R 中有一个数据框,我想使用 2 列“factor1”和“factor2”作为因子,并且我需要计算每对上述因子的所有其他列的平均值。运行下面的代码后,最后一行给出以下警告:

Warning messages:
1: In split.default(seq_along(x), f, drop = drop, ...) :
  data length is not a multiple of split variable

...

为什么会发生这种情况,我应该怎么做才能使它正确? 谢谢。

这是我的代码:

# Create data frame
myDataFrame <- data.frame(factor1=c(1,1,1,2,2,2,3,3,3), factor2=c(3,3,3,4,4,4,5,5,5), val1=c(1,2,3,4,5,6,7,8,9), val2=c(9,8,7,6,5,4,3,2,1))  

# Split by 2 columns (factors)
splitDataFrame <- split(myDataFrame, list(myDataFrame$factor1, mydataFrame$factor2))

# Calculate mean value for each column per each pair of factors
splitMeanValues <- lapply(splitDataFrame, function(x) apply(x, 2, mean))

# Combine back to reduced table whereas there is only one value (mean) per each pair of factors
MeanValues <- unsplit(splitMeanValues, list(unique(myDataFrame$factor1), unique(mydataFrame$factor2)))

EDIT1:添加数据框创建(见上文)

【问题讨论】:

  • 请提供一些示例数据,以便我们重现问题。
  • @Richard Scriven:谢谢,刚刚添加了创建数据框的行,请参见上面的问题。

标签: r split dataframe lapply split-apply-combine


【解决方案1】:

如果您需要计算除因子之外的所有其他列的平均值,可以使用aggregate()的公式语法

aggregate(.~factor1+factor2, myDataFrame, FUN=mean)

返回

  factor1 factor2 val1 val2
1       1       3    2    8
2       2       4    5    5
3       3       5    8    2

您的split() 方法不起作用,因为当您unsplit 时,您必须拥有与拆分数据时相同的行数。您将所有组的行数减少到只有一行。另外,unsplit 确实应该与用于执行split 的因素列表完全相同,否则组可能会出现故障。如果你真的想要的话,你可以使用 split 然后 lapply 一些折叠函数,然后 rbind 将列表返回到单个 data.frame 中,但简单来说,aggregate 可能是最好的。

【讨论】:

  • 谢谢,你的方法奏效了!但是有一个问题,当我尝试 unsplit 时,我在列表中使用了唯一函数,因此因子向量也应该减少。为什么这不起作用?
  • 主要问题是您的 splitMeanValues 不是 data.frames 的列表,它是命名向量的列表。 apply 函数不能很好地处理 data.frames,它将输入转换为矩阵,并最终转换为向量,这要归功于您的归约函数。
【解决方案2】:

使用doBy 包中的summaryBy() 可以获得相同的结果。尽管在这种情况下它与aggregate() 几乎相同。

> library(doBy)
> summaryBy( . ~ factor1+factor2, data = myDataFrame)
#   factor1 factor2 val1.mean val2.mean
# 1       1       3         2         8
# 2       2       4         5         5
# 3       3       5         8         2

【讨论】:

    【解决方案3】:

    你试过aggregate吗?

    aggregate(myDataFrame$valueColum, myDataFrame$factor1, FUN=mean) aggregate(myDataFrame$valueColum, myDataFrame$factor2, FUN=mean)

    【讨论】:

    • 已尝试:MeanValues
    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多