Ich habe Hockeydaten mit dem Namen 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))

Wie erstelle ich Zeilen nach jeder einzelnen Zeile und lasse 57 * 2 (114 Zeilen) übrig, aber die Werte in meinen neu erstellten Zeilen hängen von der Spalte event_rinkside ab.

  • Wenn event_rinkside gleich R ist, möchte ich 82 in coords_x und 0 in coords_y einfügen.
  • Wenn event_rinkside gleich L ist, möchte ich -82 in coords_x und 0 in coords_y einfügen.

Ich denke, die Lösung für diese SO-Frage ist ein guter Ausgangspunkt , aber ich weiß nicht, wie ich meine eigenen Bedingungen berücksichtigen soll:

Hier ist die Lösung, über die ich spreche:

library(purrr)
df %>%
  group_by(id) %>%
  map_dfr(rbind, NA) %>%
  mutate(id = rep(df$id, each = 2))
3
user8248672 19 Jän. 2019 im 00:00

4 Antworten

Beste Antwort

Hier ist eine Lösung mit dplyr:

library(dplyr)

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

So funktioniert es:

Im ersten Schritt wird mutate verwendet, um eine nicht zugewiesene Kopie von df zu ändern. Die Spalte coords_x erhält den Wert 82; Der Wert wird mit -1 multipliziert, wenn event_rinkside == "L" und andernfalls mit 1. Die Spalte coords_y erhält den Wert 0.

Im nächsten Schritt werden der unveränderte ursprüngliche Datenrahmen df und die aktuelle nicht zugewiesene und geänderte Kopie davon mit rbind kombiniert. Hier repräsentiert . das Ergebnis des obigen mutate Schritts. Das Ergebnis von rbind enthält die Zeilen der Originalversion über den Zeilen der geänderten Version.

Im letzten Schritt wird arrange verwendet, um die Zeilen entlang der Werte von event_index zu sortieren. Auf diese Weise folgt auf jede ursprüngliche Zeile direkt die entsprechende geänderte Zeile.

Das Ergebnis:

# 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
2
Sven Hohenstein 19 Jän. 2019 im 06:03

Ich bin mit r nicht allzu vertraut, der Algorithmus sollte trotzdem funktionieren. Sie möchten die Zeile in die 2n-1-Zeile verschieben. Ich würde ein zweites Array erstellen und sie manuell an den spezifischen Indizes platzieren.

Etwas Pseudocode für dich (ich schreibe normalerweise in Python, damit mein Pseudo es zeigt)

reinsert(list):
   array_out = [len(list)*2,len(list[0]) // initialize to the desired dimensions 
   array_out[0] = list[0]  /// manually insert first row cause math
   for n in range(0,len(list)):
      array_out[2n-1] = list[n] 
      array_out[2n] = event_rinkside // make a function call or make an ifthen clause to do you logic
   return(array_out)

Sie können die neu erstellten Zeilen in die Schleife einfügen oder sie hinzufügen, nachdem Sie wissen, dass sie sich alle in geradzahligen Indizes befinden.

0
Sam 18 Jän. 2019 im 21:23

Dies ähnelt der Antwort von Sven, bei der case_when verwendet wird, um zwischen den Möglichkeiten innerhalb von event_rinkside zu unterscheiden:

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
)

Wenn Sie die Bereiche Ihrer Variablen kennen, können Sie diese in if_else s vereinfachen.

0
Werner 18 Jän. 2019 im 21:27

Mein Versuch, der anderen Antworten schon ziemlich ähnlich ist,

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)
)
0
Nautica 18 Jän. 2019 im 21:29