【问题标题】:Creating a new column in R conditioned on the values in a different column and different row在 R 中创建一个新列,条件是不同列和不同行中的值
【发布时间】:2022-01-01 13:23:14
【问题描述】:

我试图弄清楚如何在 R 数据框中创建一个新列,其值基于另一列中的值,但在不同的行中。我的数据如下:

player <- c('Tim Duncan', 'Lebron James', 'Kobe Bryant', 'Paul Pierce',
            'Tim Duncan', 'Lebron James', 'Kobe Bryant', 'Paul Pierce',
            'Tim Duncan', 'Lebron James', 'Kobe Bryant', 'Paul Pierce')
t <- c(3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1)
min_per_game <-  c(30, 36, 34, 33, 31, 36, 34, 32, 29, 35, 32, 36)
pts_per_36_min <- c(19, 28, 27, 24, 22, 27, 25, 28, 23, 28, 29, 29)

df <- data.frame(player, t, min_per_game, pts_per_36_min)

我想要做的是创建一个名为“pts_per_game”的新列,它将查看数据帧中的每一行,检查“t”列中的值,然后在“t”中找到具有等效值的行player' 列,但 't' 列中的值比 1 小,然后使用 R 标识的行中的数据(特别是 min_per_game/36 * pts_per_36 min)填充新的“pts_per_game”列。

例如,在这个数据框的第一行中,'player' 列中的值是“Tim Duncan”,“t”列中的值是 3。我想让 R 看到那个,去找'player == "Tim Duncan" 和 t == 2 的行,从该行获取数据并执行 ((min_per_game/36)* pts_per_36 min),然后将结果值放入第一个数据帧行(其中玩家是Tim Duncan 和 t 是 3) 在名为“pts_per_game”的新列中。我希望它循环遍历整个数据帧并为每一行执行此操作,并理解这意味着具有最低可能值 t(在本例中为 1)的行将无法拥有“pts_per_game”为它们计算的值,因此应该收到 NA。谁能帮我弄清楚如何做到这一点?

【问题讨论】:

    标签: r dataframe for-loop lapply sapply


    【解决方案1】:

    您可以尝试使用dplyr::lead

    library(dplyr)
    df %>%
      arrange(player, desc(t)) %>%
      group_by(player) %>%
      mutate(pts_per_game = lead(min_per_game)/36 * lead(pts_per_36_min))
    
       player           t min_per_game pts_per_36_min pts_per_game
       <chr>        <dbl>        <dbl>          <dbl>        <dbl>
     1 Kobe Bryant      3           34             27         23.6
     2 Kobe Bryant      2           34             25         25.8
     3 Kobe Bryant      1           32             29         NA  
     4 Lebron James     3           36             28         27  
     5 Lebron James     2           36             27         27.2
     6 Lebron James     1           35             28         NA  
     7 Paul Pierce      3           33             24         24.9
     8 Paul Pierce      2           32             28         29  
     9 Paul Pierce      1           36             29         NA  
    10 Tim Duncan       3           30             19         18.9
    11 Tim Duncan       2           31             22         18.5
    12 Tim Duncan       1           29             23         NA  
    

    这也有效

    data.frame(player, t, min_per_game, pts_per_36_min) %>%
      arrange(player, desc(t)) %>%
      dplyr::group_by(player) %>%
      dplyr::mutate(pts_per_game = dplyr::lead(min_per_game)/36 * dplyr::lead(pts_per_36_min))
    

    【讨论】:

    • 当我尝试上述方法时,我收到错误消息“UseMethod("mutate") 中的错误:没有适用于 'mutate' 的方法应用于类对象“c('double', '数字')""
    • @ben_p_4370 dplyr::mutate 是否也会出现同样的错误?
    • @ben_p_4370 你使用的dfdf &lt;- data.frame(player, t, min_per_game, pts_per_36_min)吗?
    • @ben_p_4370 你能给我str(df)的结果吗?
    • @ben_p_4370 我会尝试重现您的错误。请稍等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多