【问题标题】:apply nested within lapply not working in R嵌套在 lapply 中的应用在 R 中不起作用
【发布时间】:2017-12-27 20:38:38
【问题描述】:

就在今天早些时候,我收到了一个非常有用的答案,解决了我遇到的一个问题,让我可以进入我的一个项目的下一步。但是,我后来在项目中再次陷入困境,我想知道是否有人可以帮助我继续前进。

上下文

目前,我有一个名为wc_match_dataframes 的充满足球比赛的数据框列表。以下是其中一个数据框的样子:

type_id tourn_id day month year team_A   score_A score_B team_B   win     loss
f       wc_1934  27  5     1934 Germany  5       2       Belgium  Germany Belgium

我无法拟合最后三列的数据,drawdrawAdrawB,但如果比赛是平局,基本上draw 列是 TRUE,如果不是,它是FALSE。在平局的情况下,赢和输一栏由Draw 填充。如果比赛是平局,drawA 列由team_A 填充,同样,drawB 列由team_B 填充。

type_idfq,具体取决于比赛是世界杯预选赛还是世界杯决赛。 tourn_id 指的是比赛所针对的锦标赛,无论是预选赛还是决赛。

总共有 39 个这样的数据框,其中 20 场世界杯比赛中的每场都有一个“决赛”数据框,以及 19 场比赛的“预选赛”数据框(第一届世界杯没有资格赛) .

我想做的事

我正在尝试使用 20 届世界杯国家级而不是比赛级的数据填充不同的数据框列表wc_dataframes。这二十个数据帧中的每一个都将包含进​​入所述锦标赛决赛的国家及其数据,如下所示:

  1. 国家
  2. 在排位赛中获胜
  3. 决赛获胜
  4. 排位赛失利
  5. 决赛失利

...等等。

我已经能够为每届世界杯填充第一个 country 列没有问题,但我遇到了其余列的问题。

这就是我正在做的事情

这是我成功运行的代码的未循环(仅适用于一个世界杯)版本:

wc_dataframes$wc_1930$fw  <- apply(wc_dataframes$wc_1930, MARGIN = 1, function(country)
                         sum(wc_match_dataframes$`wc_1930 f`$w == country, na.rm = TRUE))

这是通过计算获胜次数成功填充 wc_dataframes$wc_1930 数据框中的决赛获胜列。

现在,当我尝试将它嵌套在 lapply 下,以便在所有世界杯年份都这样做时:

lapply(names(wc_dataframes), function(year)
      wc_dataframes$year$fw  <- apply(wc_dataframes$year, MARGIN = 1, function(country)
        sum(wc_match_dataframes$`year f`$w == country, na.rm = TRUE)))

它对我不起作用。我怀疑这个问题与定义year 函数和在我的代码的sum 部分中遇到问题有关。我来自 STATA 的背景,所以我更习惯于运行 for 循环等等。我仍然习惯于 R 和列表以及所有内容,因此非常感谢您的帮助。

谢谢!

非常感谢您的帮助,祝您节日快乐! :)

【问题讨论】:

  • (1) 如果您可以提供足够的示例数据来运行您的代码以及准确的预期输出,那将会很有帮助。 (2) “这是其中一个数据框的样子:” wc_match_dataframes 数据框只有一行? (3)你考虑过dplyr吗?
  • lapply 的函数参数是否缺少花括号?
  • 您在lapply 函数中使用变量year 的方式不正确。你真的应该发布一个有效的例子。你需要像wc_dataframes[[year]]$fw &lt;- apply(wc_dataframes[[year]]... 这样的东西。你写的方式不是使用lapply传递的year,而是wc_dataframes对象中的变量year,它不存在。
  • 您好 Andrew,我很抱歉没有提供更多上下文。每个 wc_match_dataframes 都有很多行,对应于该排位赛期间 + 锦标赛的比赛次数。 Onyambu 发布的解决方案对我有用,如果您好奇,我很乐意将我的数据和代码发送给您:) Adam,是的,您是对的,很好。 JMT——谢谢,这在概念上非常有用。

标签: r dataframe apply lapply


【解决方案1】:

你需要的是输出你替换的任何东西:

lapply(names(wc_dataframes), function(year){
  wc_dataframes[[year]]$fw  <- apply(wc_dataframes[[year]], MARGIN = 1, function(country)
    sum(wc_match_dataframes[[paste(year,'f')]]$w == country, na.rm = TRUE));
  wc_dataframes}
  )

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2020-06-05
    • 2020-05-03
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2021-08-09
    相关资源
    最近更新 更多