R 在现有行之间添加具有特定值的行

R 在现有行之间添加具有特定值的行,r,dplyr,purrr,R,Dplyr,Purrr,我有曲棍球数据,叫做df structure(list(event_index = 1:57, coords_x = c(80, 53, 31, -56, -34, -33, -40, 30, -66, -36, 45, 17, -6, 47, -51, -31, -69, -86, -70, 80, 65, -76, -71, 81, -57, 80, 75, 77, -71, -40, -83, 62, 77, 76, NA, -61, 69, -45, 68, 31, 58, 61,

我有曲棍球数据,叫做
df

structure(list(event_index = 1:57, coords_x = c(80, 53, 31, -56, 
-34, -33, -40, 30, -66, -36, 45, 17, -6, 47, -51, -31, -69, -86, 
-70, 80, 65, -76, -71, 81, -57, 80, 75, 77, -71, -40, -83, 62, 
77, 76, NA, -61, 69, -45, 68, 31, 58, 61, 80, 34, 80, -85, -37, 
-57, 76, 14, 49, -82, -34, -36, -83, -84, -55), coords_y = c(-1, 
14, -30, 17, 26, -23, -37, 17, -32, -18, 25, 17, -38, 21, 28, 
22, 17, 13, 10, -37, -17, 9, 18, -11, 21, -7, 3, 3, -38, 31, 
8, -30, -2, 4, NA, -5, 15, 10, -30, -34, 20, 27, -4, 8, -18, 
19, 32, -21, 0, 40, -4, -30, -24, -28, -2, -3, 34), event_rinkside = c("R", 
"R", "R", "L", "L", "L", "L", "R", "L", "L", "R", "N", "N", "R", 
"L", "L", "L", "L", "L", "R", "R", "L", "L", "R", "L", "R", "R", 
"R", "L", "L", "L", "R", "R", "R", NA, "L", "R", "L", "R", "R", 
"R", "R", "R", "R", "R", "L", "L", "L", "R", "N", "R", "L", "L", 
"L", "L", "L", "L")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -57L))
如何在每行之后创建行,留下57*2(114行),但新创建行中的值取决于
event\u rinkside

  • 如果
    event\u rinkside
    等于
    R
    ,那么我想在
    coords\u x
    中插入
    82
    ,在
    coords\u y
    中插入
    0
  • 如果
    event\u rinkside
    等于
    L
    ,那么我想在
    coords\u x
    中插入
    -82
    ,在
    coords\u y
    中插入
    0
我觉得解决这个问题是一个很好的起点,但我不知道如何结合我自己的情况:

以下是我所说的解决方案:

library(purrr)
df %>%
  group_by(id) %>%
  map_dfr(rbind, NA) %>%
  mutate(id = rep(df$id, each = 2))

我对r不太熟悉,不管怎样,我的算法应该可以工作。您希望将该行上移到2n-1行。我将创建第二个数组,并手动将它们放在特定索引处

为您准备一些伪代码(我通常用python编写,所以我的伪代码会显示出来)


您可以在循环中插入新创建的行,或者在知道它们都将位于偶数索引之后添加它们

这里有一个使用
dplyr
的解决方案:

library(dplyr)

df %>%
  mutate(coords_x = 82 * ifelse(event_rinkside == "L", -1, 1),
         coords_y = 0) %>%
  rbind(df, .) %>%
  arrange(event_index)
工作原理:

在第一步中,
mutate
用于修改
df
的未分配副本。列
coords_x
获取82的值;如果
event\u rinkside==“L”
则该值乘以-1,否则为1。列
coords_y
的值为0

在下一步中,未更改的原始数据帧
df
及其当前未分配和修改的副本将与
rbind
组合。这里,
表示上面的
变异
步骤的结果。
rbind
的结果将原始版本的行置于修改版本的行之上

在最后一步中,
arrange
用于沿
event\u index
的值对行进行排序。这样,每个原始行后面直接跟着相应的修改行

结果是:

# A tibble: 114 x 4
   event_index coords_x coords_y event_rinkside
         <int>    <dbl>    <dbl> <chr>         
 1           1       80       -1 R             
 2           1       82        0 R             
 3           2       53       14 R             
 4           2       82        0 R             
 5           3       31      -30 R             
 6           3       82        0 R             
 7           4      -56       17 L             
 8           4      -82        0 L             
 9           5      -34       26 L             
10           5      -82        0 L             
# … with 104 more rows
#一个tible:114 x 4
事件索引坐标系x坐标系y事件坐标系
1 180-1 R
2 1 82 0 R
3 2 53 14 R
42820R
5 3 31-30 R
6 3 82 0 R
7 4-56 17升
8 4-82 0升
9 5-34 26升
105-82 0升
#…还有104行

这与斯文的回答类似,在
事件发生时使用
案例来区分
事件发生时的可能性

new_df <- df %>% bind_rows(
  df %>% mutate(
    coords_x = case_when(
      event_rinkside == 'R' ~  82,
      event_rinkside == 'L' ~ -82,
      TRUE                  ~ coords_x
    ),
    coords_y = case_when(
      event_rinkside == 'R' ~ 0,
      event_rinkside == 'L' ~ 0,
      TRUE                  ~ coords_y
    )
  )
) %>% arrange(
  event_index
)
new_df%bind_行(
df%>%突变(
coords\u x=情况(
event_rinkside=='R'~82,
事件侧=='L'~-82,
真~coords_x
),
coords_y=情况(
event_rinkside=='R'~0,
event_rinkside=='L'~0,
真的~coords_y
)
)
)%%>%排列(
事件索引
)

如果你知道变量的范围,它可以简化为
If_else
s.

我的尝试,这与其他答案非常相似

df <- df[rep(1:nrow(df), each = 2),] ## Create a duplicate row after each row

df[seq(2,nrow(df),2),] <- df[seq(2,nrow(df),2),] %>% mutate(coords_x = case_when(event_rinkside == "R" ~ 82,
                                                        event_rinkside == "L" ~ -82,
                                                        TRUE ~ coords_x),
                                   coords_y = case_when(event_rinkside == "R" ~ 0,
                                                        event_rinkside == "L" ~ 0,
                                                        TRUE ~ coords_y)
)

df你能解释一下导致这个的逻辑吗?我一步一步地看了之后才明白。Sven
使用所需的值(R为82,0)和L为(-82,0)变异
d
coords\u x
coords\u y
。然后,他使用
rbind
附加原始数据集,然后
按事件索引排列
d,以我想要的方式格式化数据集。很简单,但是brilliant@NelsonGon我添加了一个解释。@JasonBaik我添加了一个解释。
df <- df[rep(1:nrow(df), each = 2),] ## Create a duplicate row after each row

df[seq(2,nrow(df),2),] <- df[seq(2,nrow(df),2),] %>% mutate(coords_x = case_when(event_rinkside == "R" ~ 82,
                                                        event_rinkside == "L" ~ -82,
                                                        TRUE ~ coords_x),
                                   coords_y = case_when(event_rinkside == "R" ~ 0,
                                                        event_rinkside == "L" ~ 0,
                                                        TRUE ~ coords_y)
)