【问题标题】:How do I make the list output from the 'by' function in R usable?如何使 R 中“by”函数的列表输出可用?
【发布时间】:2015-12-02 16:05:51
【问题描述】:

我有一组数据,其中包含一个因变量和两个因素。我想在我的两个因素组合的每个子集中随机抽取因变量(有替换)(并且检索到的随机样本的数量应该等于两个因素的每个组合中最初存在的数量)。我已经能够使用“by”功能做到这一点。问题是输出是一个列表,我想要一些更容易访问但没有任何运气转换为数据框的东西。我的最终目标是运行上述模拟 1000 次,并为每次模拟计算针对每种因素组合检索到的随机样本的平均值。

这会产生数据集:

value<-runif(100,5,25)
cat1<-factor(rep(1:10,10))
a<-rep("A",50)
b<-rep("B",50)
cat2<-append(a,b)
data<-as.data.frame(cbind(value,cat1,cat2))

这会创建一个从因子水平中抽取的随机值的模拟,并且 将该信息存储在列表中:

list<-by(data[,"value"],data[,c("cat1","cat2")],function(x) sample(x,length(x),T))

我想要做的是最终得到一个数据框,其中包含“模拟”、“平均值”、“cat1”和“cat2”列 - 这样我就可以为 cat1 的每个组合提供 1000 条模拟线和猫 2。

关于如何使“by”输出更易于访问以便我可以在输出上运行 for 循环或其他建议的任何建议都会很棒。

谢谢!

【问题讨论】:

  • 试试do.call(rbind, list) 应该可以解决问题。
  • 警告信息:In (function (..., deparse.level = 1) : 结果的列数不是向量长度的倍数 (arg 12)
  • 谢谢,SabDeM。您的解决方案非常适合上面的模拟数据集。尽管在我的实际数据上运行那段代码,但我仍然遇到的问题是,每个因子组合的模拟值的数量对于所有因子组合都不相等。所以每行的列数不相等,我得到了上面的错误。

标签: r


【解决方案1】:

作为一种更通用的方法,您可能希望使用dplyr 而不是by。这样你就可以保留你的 data.frame。

在这种情况下,您将使用 group_by 按您的 cat1 和 cat2 分组,而不是 by,并使用 mutate 添加新列。如果您不想保留旧数据,可以将 new = 替换为 value =

library(dplyr)
data %>% group_by(cat1, cat2) %>%
         mutate(new = sample(value, length(value), replace = T))

Source: local data frame [100 x 4]
Groups: cat1, cat2 [20]

              value   cat1   cat2              new
             (fctr) (fctr) (fctr)           (fctr)
1  13.9639607304707      1      A 13.2139691384509
2  22.6068278681487      2      A 5.27278678957373
3  24.6930849226192      3      A 22.0293137291446
4   16.842244095169      4      A 9.56347029190511
5   18.467006101273      5      A 23.1605510273948
6  20.6661582039669      6      A 24.3043746100739
7  9.37060782220215      7      A 13.9268753770739
8  6.68592340312898      8      A  20.034239795059
9  6.95704637560993      9      A  12.676755907014
10 17.2769332909957     10      A  24.453850784339
..              ...    ...    ...

【讨论】:

  • 这正是我想要做的,而且效果很好。谢谢,jeremycg!
  • 我能够使用上面的建议用我的数据生成输出,但似乎“价值”的随机样本是从“价值”的整个分布中抽取的。我正在寻找的是一个随机抽取的解决方案,但仅来自 cat1 和 cat2 的组合级别,而不是来自价值的整个分布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2016-10-20
  • 2019-09-10
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多